予測

2016-09-18 13 views
2

は私は3つのデータセットを持っていますサンプルは)2(独立変数)予測

test_set xは - 10(サンプルのマトリックス)応答で定義された10(従属変数)

response <- matrix(sample.int(15, size = 5*10, replace = TRUE), nrow = 5, ncol = 10) 
colnames(response) <- c("1_DV","2_DV","3_DV","4_DV","5_DV","6_DV","7_DV","8_DV","9_DV","10_DV") 
predictors <- matrix(sample.int(15, size = 7*2, replace = TRUE), nrow = 5, ncol = 2) 
colnames(predictors) <- c("1_IV","2_IV") 
test_set <- matrix(sample.int(15, size = 10*2, replace = TRUE), nrow = 10, ncol = 2) 
colnames(test_set) <- c("1_IV","2_IV") 

私は定義されたトレーニングセットを使用して、多変量線形モデルをやってるのXは応答と予測因子セットの組み合わせはね、と私はテストセットのための予測を行うために、このモデルを使用したいと思います:

training_dataframe <- data.frame(predictors, response) 
fit <- lm(response ~ predictors, data = training_dataframe) 
predictions <- predict(fit, data.frame(test_set)) 

しかし、予測の結果は本当に奇妙です:

predictions 

ファーストオフ行列の次元は、DVの数による応答変数のサンプル数である5 x 10です。

私はRのこのタイプの分析に熟練していませんが、私はtest_setの各行に対して予測ができるように、10 x 10の行列を得てはいけませんか?

この問題を持つ任意の助けをいただければ幸いです、 マーティン

答えて

4

あなたはR.に難支持部に足を踏み入れるあなたが持っているモデルクラスは、「マルチ商法」である、すなわち、「複数の線形モデル」、されています標準の "lm"クラスではありません。共変量/予測変数の共通セットに対する複数の(独立した)応答変数があるときにそれを得ます。このようなモデルにはlm()の機能が適合しますが、 "mlm"クラスの場合はpredictメソッドが不良です。 methods(predict)を見ると、predict.mlm*が表示されます。通常、 "lm"クラスの線形モデルの場合、predictを呼び出すとpredict.lmが呼び出されます。 "mlm"クラスの場合はpredict.mlm*が呼び出されます。

predict.mlm*はあまりにも原始的です。 se.fitは許されない、すなわち、理論上は可能であるが、予測誤差、信頼/予測間隔などを生成することはできない。それは予測平均しか計算できません。もしそうなら、私たちはなぜpredict.mlm*を使ってみたいのですか?予測平均は、簡単な行列 - 行列乗算(標準の "lm"クラスではこれは行列 - ベクトル乗算)によって得られるので、我々自身でそれを行うことができる。

この小さな再現例を考えてみましょう。

set.seed(0) 
## 2 response of 10 observations each 
response <- matrix(rnorm(20), 10, 2) 
## 3 covariates with 10 observations each 
predictors <- matrix(rnorm(30), 10, 3) 
fit <- lm(response ~ predictors) 

class(fit) 
# [1] "mlm" "lm" 

beta <- coef(fit) 
#     [,1]  [,2] 
#(Intercept) 0.5773235 -0.4752326 
#predictors1 -0.9942677 0.6759778 
#predictors2 -1.3306272 0.8322564 
#predictors3 -0.5533336 0.6218942 

あなたは、予測データセットがある場合:

# 2 new observations for 3 covariats 
test_set <- matrix(rnorm(6), 2, 3) 

は、我々が最初に続いて

pred <- Xp %*% beta 
#   [,1]  [,2] 
#[1,] -2.905469 1.702384 
#[2,] 1.871755 -1.236240 

おそらく、この行列の乗算を行うパッドにインターセプト列

Xp <- cbind(1, test_set) 

を必要としますあなたはそれに気づいた私はここでもデータフレームを使用していませんでした。 はい、すべてが行列形式であるので、それは不要です。これらのRのウィザードでは、おそらくlm.fit、さらにはqr.solveを使用する方が簡単です。


しかし、完全な答えとして、私たちの目的の結果を得るためにpredict.mlmを使用する方法を実証するために必要不可欠です。私はdata.frame()を使用する場合

## still using previous matrices 
training_dataframe <- data.frame(response = I(response), predictors = I(predictors)) 
fit <- lm(response ~ predictors, data = training_dataframe) 
newdat <- data.frame(predictors = I(test_set)) 
pred <- predict(fit, newdat) 
#   [,1]  [,2] 
#[1,] -2.905469 1.702384 
#[2,] 1.871755 -1.236240 

I()に注意してください。これは、のデータフレームを取得したいときに必要です。

str(data.frame(response = I(response), predictors = I(predictors))) 
#'data.frame': 10 obs. of 2 variables: 
# $ response : AsIs [1:10, 1:2] 1.262954.... -0.32623.... 1.329799.... 1.272429.... 0.414641.... ... 
# $ predictors: AsIs [1:10, 1:3] -0.22426.... 0.377395.... 0.133336.... 0.804189.... -0.05710.... ... 

str(data.frame(response = response, predictors = predictors)) 
#'data.frame': 10 obs. of 5 variables: 
# $ response.1 : num 1.263 -0.326 1.33 1.272 0.415 ... 
# $ response.2 : num 0.764 -0.799 -1.148 -0.289 -0.299 ... 
# $ predictors.1: num -0.2243 0.3774 0.1333 0.8042 -0.0571 ... 
# $ predictors.2: num -0.236 -0.543 -0.433 -0.649 0.727 ... 
# $ predictors.3: num 1.758 0.561 -0.453 -0.832 -1.167 ... 

マトリックス入力を保護するために、データが乱雑です。これがlmに問題を引き起こさないことは驚くべきことですが、predict.mlmは、I()を使用しないと、予測のための正しい行列を得るのが難しくなります。

この場合、「データフレーム」の代わりに「リスト」を使用することをお勧めします。data引数はlmでもnewdataの引数はpredictでリスト入力が可能です。 「リスト」は、データフレームよりも一般的な構造であり、データ構造を問題なく保持することができます。我々は行うことができます。

## still using previous matrices 
training_list <- list(response = response, predictors = predictors) 
fit <- lm(response ~ predictors, data = training_list) 
newdat <- list(predictors = test_set) 
pred <- predict(fit, newdat) 
#   [,1]  [,2] 
#[1,] -2.905469 1.702384 
#[2,] 1.871755 -1.236240 

はおそらく、最後の最後に、私はむしろマトリックス界面よりも、式インタフェースを使用することが常に安全であることを強調すべきです。再構築可能な例として、R組み込みデータセットtreesを使用します。

fit <- lm(cbind(Girth, Height) ~ Volume, data = trees) 

## use the first two rows as prediction dataset 
predict(fit, newdata = trees[1:2, ]) 
#  Girth Height 
#1 9.579568 71.39192 
#2 9.579568 71.39192 

おそらく、あなたはまだ私はpredict.mlm*se.fitをサポートするにはあまりにも原始的であることを言って覚えておいてください。これはそれをテストするチャンスです。

predict(fit, newdata = trees[1:2, ], se.fit = TRUE) 
#Error in predict.mlm(fit, newdata = trees[1:2, ], se.fit = TRUE) : 
# the 'se.fit' argument is not yet implemented for "mlm" objects 

おっと...どの程度信頼/予測区間(実際には標準誤差を計算する能力なしに、それらの間隔を製造することは不可能である)?さて、predict.mlm*は無視します。

predict(fit, newdata = trees[1:2, ], interval = "confidence") 
#  Girth Height 
#1 9.579568 71.39192 
#2 9.579568 71.39192 

これはpredict.lmと比べて非常に異なっています。

+0

この場合のMLMは、「多変量線形モデル」の略です。 –

+0

私は分かりました、ありがとう! –