2017-06-14 5 views
1

現在、いくつかのモデルを互いに効率的にテストするために自分自身を改善しようとしています。Vectorize()に異なる種類の引数を渡します。

与えられた従属変数(dataの列11)について、説明入力変数によって異なる線形モデルが推定されます。私の願いは、abというパラメータのペアを持って、私のデータフレームdataの説明変数の選択の開始と終了の列を決定することです。

これらのパラメータの組み合わせはparametersに保存されています。その行にパラメータを指定して、ある小節(ここではdf.residual)の評価を含む列を追加したいと思います。

ただし、問題のベクトル化に失敗します。具体的には、私はabを正しく渡しますが、dataは渡しません。

# Example data 
data = as.data.frame(mtcars) 

# Setting the parameters for choosing x-columns 
# a is the start column, b the end column 
parameters = tidyr::expand(tibble(a=1:5, b = 1:5 * 2),a,b) %>% 
dplyr::filter(a<b) 


# Define the function called to yield the result 
another_fun = function(a, b, data) {  
# Vectorize, here's some trouble 
    case_fun_another = Vectorize( 
    function(a, b, data=data) { 
     x = as.matrix(data[,a:b]) 
     y = as.matrix(data[,11]) 
     lm.fit(x=x,y=y)$df.residual 
    }, SIMPLIFY = FALSE 
) 

output = case_fun_another(a, b) 
return(output) 
} 

# Calculate result 
parameters = dplyr::mutate(parameters, result=another_fun(a, b, data)) 

その利回り:私はこのトピックに見つけ

promise already under evaluation: recursive default argument reference or earlier problems?

質問は私にとって非常に分かりませんでした。たぶん、問題の説明があれば簡単になります。

これに対処する方法はありますか?私はVectorizeを使う以外の選択肢もあります:-)

あらかじめ多くの感謝を申し上げます。

+0

@李哲源Zheyuan Li:誇り - これは助けてくれました。私はたくさんのことを教えてくれました。ありがとうございます。 – MaHo

答えて

2

ここでは、入れ子関数とVectorizeを使用しない代わりの方法を示します。 lm.object式コールを保持するためbquoteの使用を指摘し@Rolandへ

# get all the possible pairwise combination of independent variables with combn 
ind.var <- names(data)[-11] %>% 
     combn(., 2) %>% 
     t 

head(ind.var) 

#  [,1] [,2] 
# [1,] "mpg" "cyl" 
# [2,] "mpg" "disp" 
# [3,] "mpg" "hp" 
# [4,] "mpg" "drat" 
# [5,] "mpg" "wt" 
# [6,] "mpg" "qsec" 


# paste values of each row of ind.var, with separator "+" 

x <- do.call(paste, c(as.list(data.frame(ind.var, stringsAsFactors = FALSE)), sep="+")) 
y <- "carb" 

# write out all the linear model formula: 

forms <- mapply(function(a,b) paste(a, b, sep="~"), y, x) %>% 
     setNames(NULL) 

all.lm <- lapply(forms, function(x) eval(bquote(lm(.(x), data=data)))) 

all.lm[[1]] 

# Call: 
# lm(formula = "carb~mpg+cyl", data = data) 
# 
# Coefficients: 
# (Intercept)   mpg   cyl 
#  3.63978  -0.09968  0.18995 

感謝。

+0

とにかく解析しないでください。最後の文は次のように扱うことができます: 'f < - Sepal.Length〜。; eval(bquote(lm(。(f)、data = iris))) '(簡単にするために別の例を使用します)。テキストの解析は避けてください。 – Roland

+0

この例はうまくいきます、ありがとうございます。希望するパラメータに拡張できるかどうかを検討しなければなりません。 – MaHo

+1

@Roland「bquote」に警告してくれてありがとう。私はできればコードを整理します。 –

関連する問題