web-dev-qa-db-ja.com

警告の取得:「 'newdata'には1行ありましたが、見つかった変数には32行あります」

Rで予測とlm関数を使用しているときに特異性が見つかりました。同じデータのデータフレームとベクトルで異なる結果が得られました。

DataFrameコード:

data(mtcars)
fitCar<-lm(mtcars$mpg~mtcars$wt)
predict(fitCar,
        data.frame(x=mean(mtcars$wt)),
        interval="confidence")

出力:

     fit       lwr      upr
1  23.282611 21.988668 24.57655
2  21.919770 20.752751 23.08679
3  24.885952 23.383008 26.38890
4  20.102650 19.003004 21.20230
5  18.900144 17.771469 20.02882
6  18.793255 17.659216 19.92729
7  18.205363 17.034274 19.37645
8  20.236262 19.136179 21.33635
9  20.450041 19.347720 21.55236
10 18.900144 17.771469 20.02882
11 18.900144 17.771469 20.02882
12 15.533127 14.064349 17.00190
13 17.350247 16.104455 18.59604
14 17.083024 15.809403 18.35664
15  9.226650  6.658271 11.79503
16  8.296712  5.547468 11.04596
17  8.718926  6.052112 11.38574
18 25.527289 23.927797 27.12678
19 28.653805 26.519252 30.78836
20 27.478021 25.554415 29.40163
21 24.111004 22.715653 25.50635
22 18.472586 17.319886 19.62529
23 18.926866 17.799465 20.05427
24 16.762355 15.452833 18.07188
25 16.735633 15.423002 18.04826
26 26.943574 25.112491 28.77466
27 25.847957 24.198041 27.49787
28 29.198941 26.963760 31.43412
29 20.343151 19.242185 21.44412
30 22.480940 21.268498 23.69338
31 18.205363 17.034274 19.37645
32 22.427495 21.219818 23.63517

警告メッセージ:

「newdata」には1行ありましたが、見つかった変数には32行があります

両方のデータをベクトルに分離すると、異なる答えが得られました

ベクターのコード

predict(fit,data.frame(x=mean(x)), interval="confidence")

出力:

    fit   lwr   upr
1 20.09 18.99 21.19

この違いの理由は何ですか?

51
Kppatel Patel

これは、datanewdataの間で異なる名前を使用する問題であり、ベクトルまたはデータフレームを使用する間の問題ではありません。

モデルをlm関数で近似し、predictを使用して予測を行うと、predictnewdataで同じ名前を見つけようとします。最初のケースでは、xmtcars$wtと競合するため、警告が表示されます。

ここで私が言うことの実例を見て​​ください:

これはあなたがやったことであり、エラーは発生しませんでした:

a <- mtcars$mpg
x <- mtcars$wt

#here you use x as a name
fitCar <- lm(a ~ x) 
#here you use x again as a name in newdata.
predict(fitCar, data.frame(x = mean(x)), interval = "confidence") 

       fit      lwr      upr
1 20.09062 18.99098 21.19027

この場合、名前xを使用してモデルを近似し、newdataで名前xを使用して予測することを確認してください。この方法では、警告は表示されず、期待どおりです。

モデルに適合するときに名前を別の名前に変更するとどうなるか見てみましょう。

a <- mtcars$mpg
#name it b this time
b <- mtcars$wt 

fitCar <- lm(a ~ b) 
#here I am using name x as previously
predict(fitCar, data.frame(x = mean(x)), interval = "confidence") 

         fit       lwr      upr
1  23.282611 21.988668 24.57655
2  21.919770 20.752751 23.08679
3  24.885952 23.383008 26.38890
4  20.102650 19.003004 21.20230
5  18.900144 17.771469 20.02882
Warning message:
'newdata' had 1 row but variables found have 32 rows 

今やったことは、モデルをxに当てはめるときに名前bを変更し、xの名前newdataを使用して予測することでした。ご覧のとおり、質問と同じエラーが表示されました。

これが今明確であることを願っています!

77
LyzandeR

Lm関数の式では、datasetname $ variablenameパターンを使用して変数を参照しないでください。代わりにvariablename + variablenameを使用してください...これは警告をスローしません: 'newdata'にはnrow(test)行がありますが、見つかった変数にはnrow(train)行があります。

9
Priya

名前を付けずにこれを回避する方法は、次を使用することです。

fitCar<-lm(mpg ~ wt, mtcars) #here you use x as a name
predict(fitCar,data.frame(wt=mean(mtcars$wt)), interval="confidence") 
8
sbanders

$記号を使用してデータ名と組み合わせて変数名を使用しているときに、同じ問題が発生しました。

代わりに:

fitCar<-lm(mtcars$mpg~mtcars$wt)
predict(fitCar,
        data.frame(x=mean(mtcars$wt)),
        interval="confidence")

これを使って:

fitCar<-lm(mpg~wt , data = mtcars)
predict(fitCar,  
wt = mean(mtcars$wt), interval = "confidence")
0
Nitish Raj