私はあなたが間違って取得しない場合、あなたはこのようなデータセットで作業している:y1
、y2
とy3
は、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))
x1
、x2
とは、共変量です。現在、あなたは時間ごとに一つのモデルを当てはめ、y1
、y2
、y3
をループを使用している
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=3
とm=3
については、fit <- lm(cbind(y1, y2, y3) ~ ., data = dat))
の場合です。しかし、これはどのようにしてdf
の構造を使って自動的に行うことができますか?私は(for i in (1:n)) fit <- lm(cbind(df[something] ~ df[something], data = dat))
のようなものを意味する。その「何か」はpaste
とpaste0
で作成しました。ありがとうございました。
paste0("cbind(", paste(names(df)[1:n], collapse = ", "), ")", " ~ .")
例えば、iris
データセットを使用して::
paste0("cbind(", paste(names(iris)[1:2], collapse = ", "), ")", " ~ .")
# "cbind(Sepal.Length, Sepal.Width) ~ ."
あなたはlm
として、lm
にこの文字列式を渡すことができますあなたはまだpaste
とpaste0
によってモデル式を作成することができます
自動的に数式クラスに変換します。
お寄せいただきありがとうございます。私は一般化に興味があります。私はもっと具体的にしましょう。私は最初の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を分割すべきですか?の代わりに、または。ありがとうございました。 –
はい、それは完全にそれでした。ありがとうございました! –
もちろん、投票方法は? –