收到警告:“'newdata' 有 1 行,但找到的变量有 32 行”在 predict.lm

Posted

技术标签:

【中文标题】收到警告:“\'newdata\' 有 1 行,但找到的变量有 32 行”在 predict.lm【英文标题】:Getting Warning: " 'newdata' had 1 row but variables found have 32 rows" on predict.lm收到警告:“'newdata' 有 1 行,但找到的变量有 32 行”在 predict.lm 【发布时间】:2015-02-12 10:02:42 【问题描述】:

我在 R 中使用 predict 和 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

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

【问题讨论】:

【参考方案1】:

这是在 datanewdata 之间使用不同名称的问题,而不是使用向量或数据帧之间的问题。

当您使用lm 函数拟合模型,然后使用predict 进行预测时,predict 会尝试在您的newdata 上找到相同的名称。在您的第一种情况下,名称 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 

我现在唯一做的就是在将模型拟合为 b 时更改名称 x,然后在 newdata 中使用名称 x 进行预测。如您所见,我遇到了与您的问题相同的错误。

希望现在清楚了!

【讨论】:

为什么在这种情况下会出现同样的错误? install.packages("car") library(car) data(Quartet) lmfit = lm(Quartet$y2 ~ poly(Quartet$x,2,raw=TRUE)) newdata = data.frame(x = c(3,6,15)) predict(lmfit, newdata, interval = "confidence", level = 0.95) @agaved 您的情况之一,因为您使用完整的Quartet$x 名称,predict 也将在newdata 中查找此内容。由于 newdata 中没有 Quartet$x 而只有 newdata$x 它失败了。 @agaved 另外,如果您有新问题,请将其作为新问题提出。不要使用 cmets 提出不同的问题。这是与问题中提到的问题不同的问题。 在此答案中描述的两种情况中的后一种情况下,R 在做什么?为什么会给出五行输出?【参考方案2】:

一种不命名的方法是使用以下方法:

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

【讨论】:

【参考方案3】:

在 lm 函数的公式中,不要使用 datasetname$variablename 模式引用变量。而是使用变量名 + 变量名 ...这不会引发警告:'newdata' has nrow(test) row but variables found have nrow(train) rows。

【讨论】:

你知道为什么吗?为什么df$varvar, data=df不一样???【参考方案4】:

当我将变量名与数据名结合使用$ 符号时,我遇到了同样的问题。

所以而不是:

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")

【讨论】:

【参考方案5】:

不要将 lm 定义为 fitCar

【讨论】:

以上是关于收到警告:“'newdata' 有 1 行,但找到的变量有 32 行”在 predict.lm的主要内容,如果未能解决你的问题,请参考以下文章

在 ARC 中收到内存警告

收到太多 Proguard 警告

收到有关不兼容指针类型的警告

为啥我收到此警告“缺少推送通知权利”

从 iphone 相机拍照时收到 iphone 中的内存警告问题

从相机点击多张图像时收到内存警告