2016-11-21 8 views
0

私は以下のデータセットを用意しています。データフレーム内の複数の列にlm()とpredict()を適用する

train<-data.frame(x1 = c(4,5,6,4,3,5), x2 = c(4,2,4,0,5,4), x3 = c(1,1,1,0,0,1), 
        x4 = c(1,0,1,1,0,0), x5 = c(0,0,0,1,1,1)) 

、私は列用に別のモデルを作成したいとしx4、コラムx1x2に基づいてx5。例

lm1 <- lm(x3 ~ x1 + x2) 
lm2 <- lm(x4 ~ x1 + x2) 
lm3 <- lm(x5 ~ x1 + x2) 

のために私は、これらのモデルを取ると予測し、その後、コラムなど、各モデルの結果を有するマトリックスを作成し使用して、テスト・セットにそれらを適用したいです。

test <- data.frame(x1 = c(4,3,2,1,5,6), x2 = c(4,2,1,6,8,5)) 
p1 <- predict(lm1, newdata = test) 
p2 <- predict(lm2, newdata = test) 
p3 <- predict(lm3, newdata = test) 
final <- cbind(p1, p2, p3) 

これは段階的に行うことができる単純化されたバージョンです。実際のデータは非常に大きいです。関数を作成する方法やfor文を使用してこれを1つまたは2つのステップに結合する方法はありますか?

答えて

0

私はあなたの質問をFitting a linear model with multiple LHSに重複して記入する傾向がありましたが、悲しいことに予測の問題はそこで解決されていません。一方、Prediction of 'mlm' linear model object from lm()では予測について話していますが、マトリクスインターフェイスではなく式インターフェイスを使用しているため、少し離れています。

"mlm" tagに完全な重複ターゲットを見つけることができませんでした。だから私はこのタグのために別の答えを寄せることをお勧めします。リンクされた質問で述べたように、predict.mlmse.fitをサポートしていませんが、現時点ではこれも "mlm"タグでは見つからない問題です。だから私はこのようなギャップを埋めるためにこのチャンスをとるだろう。ここで


予測の標準誤差を取得するための機能である:

:あなたの与え例えば

f <- function (mlmObject, newdata) { 
    ## model formula 
    form <- formula(mlmObject) 
    ## drop response (LHS) 
    form[[2]] <- NULL 
    ## prediction matrix 
    X <- model.matrix(form, newdata) 
    Q <- forwardsolve(t(qr.R(mlmObject$qr)), t(X)) 
    ## unscaled prediction standard error 
    unscaled.se <- sqrt(colSums(Q^2)) 
    ## residual standard error 
    sigma <- sqrt(colSums(residuals(mlmObject)^2)/mlmObject$df.residual) 
    ## scaled prediction standard error 
    tcrossprod(unscaled.se, sigma) 
    } 

を、あなたは

## fit an `mlm` 
fit <- lm(cbind(x3, x4, x5) ~ x1 + x2, data = train) 

## prediction (mean only) 
pred <- predict(fit, newdata = test) 

#   x3   x4   x5 
#1 0.555956679 0.38628159 0.60649819 
#2 0.003610108 0.47653430 0.95848375 
#3 -0.458483755 0.48014440 1.27256318 
#4 -0.379061372 -0.03610108 1.35920578 
#5 1.288808664 0.12274368 0.17870036 
#6 1.389891697 0.46570397 0.01624549 

## prediction error 
pred.se <- f(fit, newdata = test) 

#   [,1]  [,2]  [,3] 
#[1,] 0.1974039 0.3321300 0.2976205 
#[2,] 0.3254108 0.5475000 0.4906129 
#[3,] 0.5071956 0.8533510 0.7646849 
#[4,] 0.6583707 1.1077014 0.9926075 
#[5,] 0.5049637 0.8495959 0.7613200 
#[6,] 0.3552794 0.5977537 0.5356451 

を行うことができます私たちは、fが正しいことを確認することができます

## `lm1`, `lm2` and `lm3` are defined in your question 
predict(lm1, test, se.fit = TRUE)$se.fit 
#  1   2   3   4   5   6 
#0.1974039 0.3254108 0.5071956 0.6583707 0.5049637 0.3552794 

predict(lm2, test, se.fit = TRUE)$se.fit 
#  1   2   3   4   5   6 
#0.3321300 0.5475000 0.8533510 1.1077014 0.8495959 0.5977537 

predict(lm3, test, se.fit = TRUE)$se.fit 
#  1   2   3   4   5   6 
#0.2976205 0.4906129 0.7646849 0.9926075 0.7613200 0.5356451 
+0

ありがとうございます。ロット。追加するには、glmnetという別のモデルを使用する場合はどうすればいいですか? 'y'の値には何が使えますか?私は上記を試みたが、そのフォームは受け入れられていない。 – SRB

+0

私は投票できなかったので、私は受け入れることができないと思った。それは今終わった。 – SRB

関連する問題