2016-09-01 1 views
2

私はRに新しく、*apply関数を使って次のスクリプトを改善したいと考えています(私はapplyについて読んでいますが、使用することができませんでした)。私はlm関数を複数の独立変数(データフレームの列)に使用したいと思います。私は複数のLHSを持つ線形モデルをフィッティング

formula=function(x) 
{ 
    as.formula (paste(names(data[x]),'~', paste0(names(data[-1:-3]), collapse = '+')), env=parent.frame()) 
} 

はありがとうと定義されて

for (i in (1:3) { 
    assign(paste0('lm.',names(data[i])), lm(formula=formula(i),data=data)) 
    } 

Formula(i)を使用しました。

答えて

5

私はあなたが間違って取得しない場合、あなたはこのようなデータセットで作業している:y1y2y3は、3つの独立した応答している間

set.seed(0) 
dat <- data.frame(y1 = rnorm(30), y2 = rnorm(30), y3 = rnorm(30), 
        x1 = rnorm(30), x2 = rnorm(30), x3 = rnorm(30)) 

x1x2とは、共変量です。現在、あなたは時間ごとに一つのモデルを当てはめ、y1y2y3をループを使用している

y1 ~ x1 + x2 + x3 
y2 ~ x1 + x2 + x3 
y3 ~ x1 + x2 + x3 

:あなたは、3つの線形モデルに合うようにしようとしています。 forループをたとえばlapplyに置き換えることで、処理を高速化することができます。

私はあなたが間違っていることを指摘したいと思います。lm()は高価な操作です。データセットが小さくない限り、forループのコストはごくわずかです。 forループをlapplyに置き換えると、パフォーマンスが向上しません。

3つのモデルすべてで同じRHSを使用しているため、モデルマトリックスは3つのモデルで同じです。したがって、すべてのモデルのQR分解は一度だけ行う必要があります。 lmはこれを可能にし、あなたが使用することができます:あなたはstr(fit)をチェックすると、あなたはこれが3つの線形モデルのリストではないことがわかります

fit <- lm(cbind(y1, y2, y3) ~ x1 + x2 + x3, data = dat) 
#Coefficients: 
#    y1   y2   y3  
#(Intercept) -0.081155 0.042049 0.007261 
#x1   -0.037556 0.181407 -0.070109 
#x2   -0.334067 0.223742 0.015100 
#x3   0.057861 -0.075975 -0.099762 

。代わりに、単一の線形モデルで、単一の$qrオブジェクトですが、複数のLHSを持ちます。したがって、$coefficients,$residualsおよび$fitted.valuesは行列です。

あなたはより多くの共変量を持っている場合は、あなたが.を使って入力するか貼り付け式を避けることができます。

fit <- lm(cbind(y1, y2, y3) ~ ., data = dat) 
#Coefficients: 
#    y1   y2   y3  
#(Intercept) -0.081155 0.042049 0.007261 
#x1   -0.037556 0.181407 -0.070109 
#x2   -0.334067 0.223742 0.015100 
#x3   0.057861 -0.075975 -0.099762 

注意:書き込まないでください:

y1 + y2 + y3 ~ x1 + x2 + x3 

この意志単一の応答としてy = y1 + y2 + y3を扱う。 cbind()を使用してください。


フォローアップ:

ご回答いただきありがとうございます。私は一般化に興味があります。私はもっ​​と具体的にしましょう。私はデータフレームdfを持っています。最初のn列は独立変数です(y1,y2,y3,....)と次のm列は従属変数(x1+x2+x3+....)です。 n=3m=3については、fit <- lm(cbind(y1, y2, y3) ~ ., data = dat))の場合です。しかし、これはどのようにしてdfの構造を使って自動的に行うことができますか?私は(for i in (1:n)) fit <- lm(cbind(df[something] ~ df[something], data = dat))のようなものを意味する。その「何か」はpastepaste0で作成しました。ありがとうございました。

paste0("cbind(", paste(names(df)[1:n], collapse = ", "), ")", " ~ .") 

例えば、irisデータセットを使用して::

paste0("cbind(", paste(names(iris)[1:2], collapse = ", "), ")", " ~ .") 
# "cbind(Sepal.Length, Sepal.Width) ~ ." 

あなたはlmとして、lmにこの文字列式を渡すことができますあなたはまだpastepaste0によってモデル式を作成することができます

自動的に数式クラスに変換します。

+0

お寄せいただきありがとうございます。私は一般化に興味があります。私はもっ​​と具体的にしましょう。私は最初のn列が独立変数(y1、y2、y3、....)で、次のm列は従属変数(x1 + x2 + x3 + ....)であるデータフレーム(df)を持っています。 n = 3、m = 3の場合、fit < - lm(cbind(y1、y2、y3)〜、data = dat)の場合が該当します。しかし、dfの構造を使って、これを自動的にどのように行うことができますか?私は、(1:nの)iのようなものを意味する。 - lm(cbind(df [something]〜、data = dat))。私は(1:n)y(i)< - df [i]のためにdf - forを分割すべきですか?の代わりに、または。ありがとうございました。 –

+0

はい、それは完全にそれでした。ありがとうございました! –

+0

もちろん、投票方法は? –

関連する問題