在收到警告:“‘newdata’有1行,但发现变量具有32行”上predict.lm在收到警告:“‘

2019-05-10 09:48发布

我发现特殊性而使用预测和R. LM功能我为相同的数据的数据帧和矢量不同的结果。

数据帧代码:

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

是什么造成这种差异的原因吗?

Answer 1:

这是使用之间的不同名称的问题, data和您的newdata和不使用载体或dataframes之间的问题。

当你正好与模型lm功能,然后使用predict做出预测, predict试图找到对你相同的名称newdata 。 在你的第一个案例名称x与冲突mtcars$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模型以及使用该名称X你预测newdata 。 这样,你得到任何警告,这是你所期望的。

让我们来看看,当我将名称更改为别的东西,当我拟合模型会发生什么:

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 ,然后使用名称预测xnewdata 。 正如你所看到的,我得到了同样的错误在你的问题。

现在希望这是明确的!



Answer 2:

在配方LM功能不涉及使用数据集名称$ VARIABLENAME模式中的变量。 而是使用VARIABLENAME + VARIABLENAME ......这不会引发警告:“newdata”有nrow(测试)行,但发现变量具有nrow(火车)行。



Answer 3:

解决的办法未做名称是使用以下命令:

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


文章来源: Getting Warning: “ 'newdata' had 1 row but variables found have 32 rows” on predict.lm
标签: r prediction lm