lm predict 不会预测

Posted

技术标签:

【中文标题】lm predict 不会预测【英文标题】:lm predict won't predict 【发布时间】:2012-04-11 10:36:01 【问题描述】:

我有 2 个数据框。一个是训练数据(pubs1),另一个是(pubs2)测试数据。我可以创建线性回归对象,但无法创建预测。这不是我第一次这样做,也不知道出了什么问题。

> head(pubs1 )
  id   pred37   actual     weight       diff1   weightDiff1    pred1    pred2    pred3    pred4
1 11 128.3257 128.3990 6.43482732 -0.07333650 -0.4719076922 126.3149 126.1024 126.9057 126.2718
2 31 100.8822 100.9777 3.55520287 -0.09553741 -0.3396548680 100.7820 100.8589 100.9179 100.8903
3 33 100.7204 100.9630 7.46413438 -0.24262409 -1.8109787866 100.8576 100.8434 100.8521 100.8914
4 52 100.8564 100.9350 0.01299138 -0.07855588 -0.0010205495 100.8700 100.8925 100.8344 100.8714
5 56 100.8410 100.9160 0.01299138 -0.07502125 -0.0009746298 100.8695 100.8889 100.8775 100.8871
6 71 100.8889 100.8591 1.19266269  0.02979818  0.0355391800 100.8357 100.9205 100.8107 100.8316
> head(pubs2 )
      id    pred37     pred1    pred2     pred3     pred4
1 762679  98.32212  97.84181  98.0776  98.03222  97.90022
2 762680 115.79698 114.91411 115.1470 115.27129 115.45027
3 762681 104.56418 104.81372 104.8537 104.66239 104.55240
4 762682 106.65768 106.71011 106.6722 106.68662 106.60757
5 762683 102.15662 103.14207 103.2035 103.31190 103.40397
6 762684 101.96057 102.25939 102.1031 102.20659 102.04557

> lm1 <- lm(pubs1$actual ~ pubs1$pred37 + pubs1$pred1 + pubs1$pred2 
+ + pubs1$pred3 + pubs1$pred4)
> summary(lm1)

Call:
lm(formula = pubs1$actual ~ pubs1$pred37 + pubs1$pred1 + pubs1$pred2 + 
    pubs1$pred3 + pubs1$pred4)

Residuals:
     Min       1Q   Median       3Q      Max 
-18.3415  -0.2309   0.0016   0.2236  17.8639 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -0.122478   0.027227  -4.498 6.85e-06 ***
pubs1$pred37  0.543270   0.005086 106.823  < 2e-16 ***
pubs1$pred1   0.063680   0.007151   8.905  < 2e-16 ***
pubs1$pred2   0.317768   0.010977  28.950  < 2e-16 ***
pubs1$pred3   0.024302   0.008321   2.921  0.00349 ** 
pubs1$pred4   0.052183   0.010879   4.797 1.61e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.7298 on 99994 degrees of freedom
Multiple R-squared: 0.9932,     Adjusted R-squared: 0.9932 
F-statistic: 2.926e+06 on 5 and 99994 DF,  p-value: < 2.2e-16 

>

 > pred2 <- predict(lm1, pubs2)
Warning message:
'newdata' had 50000 rows but variable(s) found have 100000 rows

> str(pubs1)
'data.frame':   100000 obs. of  10 variables:
 $ id         : num  11 31 33 52 56 71 85 87 92 95 ...
 $ pred37     : num  128 101 101 101 101 ...
 $ actual     : num  128 101 101 101 101 ...
 $ weight     : num  6.435 3.555 7.464 0.013 0.013 ...
 $ diff1      : num  -0.0733 -0.0955 -0.2426 -0.0786 -0.075 ...
 $ weightDiff1: num  -0.471908 -0.339655 -1.810979 -0.001021 -0.000975 ...
 $ pred1      : num  126 101 101 101 101 ...
 $ pred2      : num  126 101 101 101 101 ...
 $ pred3      : num  127 101 101 101 101 ...
 $ pred4      : num  126 101 101 101 101 ...
> str(pubs2)
'data.frame':   50000 obs. of  6 variables:
 $ id    : num  762679 762680 762681 762682 762683 ...
 $ pred37: num  98.3 115.8 104.6 106.7 102.2 ...
 $ pred1 : num  97.8 114.9 104.8 106.7 103.1 ...
 $ pred2 : num  98.1 115.1 104.9 106.7 103.2 ...
 $ pred3 : num  98 115 105 107 103 ...
 $ pred4 : num  97.9 115.5 104.6 106.6 103.4 ...
> colnames(pubs1)
 [1] "id"          "pred37"      "actual"      "weight"      "diff1"       "weightDiff1" "pred1"       "pred2"       "pred3"       "pred4"      
> colnames(pubs2)
[1] "id"     "pred37" "pred1"  "pred2"  "pred3"  "pred4" 

这里有什么我遗漏的吗?

【问题讨论】:

尝试在lm 调用中放弃(不必要的)使用$,并在data 参数中传递您的数据框。 @joran:成功了,谢谢。 @joran,发表评论作为答案? 【参考方案1】:

而不是,

lm1 <- lm(pubs1$actual ~ pubs1$pred37 + pubs1$pred1 + pubs1$pred2 
          pubs1$pred3 + pubs1$pred4)

试试,

lm1 <- lm(actual ~ pred37 + pred1 + pred2 
          pred3 + pred4, data = pubs1)

否则predict.lm 将在您的新数据框中查找名为pubs1$pred37 的变量。

【讨论】:

以上是关于lm predict 不会预测的主要内容,如果未能解决你的问题,请参考以下文章

predict.lm() 在测试数据中具有未知因子水平

如何调试线性模型和预测的“因子具有新水平”错误[重复]

将 predict 与 lm() 对象列表一起使用

Predict() - 也许我不明白

为数据框的子集创建预测并附加到原始文件

(水文)目标检测里的预测inference(推断)是啥,就是(prediction)(预测)