获得警告:“'newdata'有1行,但是发现variables有32行”在R中的predict.lm

我在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行,但是find的variables有32行

当我将两个数据分离出来,我得到了不同的答案

vector代码

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

输出:

  fit lwr upr 1 20.09 18.99 21.19 

这种差异的原因是什么?

这是在data和新data之间使用不同名称的问题,而不是使用vector或数据框之间的问题。

当你用lm函数拟合一个模型,然后使用predict做出预测时, predict试图在你的新数据上find相同的名字。 在你的第一个例子中,名字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来匹配模型,并预测在新数据中使用名称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 ,然后在新数据中使用名称x进行预测。 正如你所看到的,我得到了和你的问题一样的错误。

希望这是明确的!

解决这个问题的一个方法就是使用下面的命令:

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

在lm函数的公式中,不要使用datasetname $ variablename pattern引用variables。 而是使用variablename + variablename …这不会抛出警告:'newdata'有nrow(testing)行,但是发现variables有nrow(train)行。