R:在predict()中,numeric 'envir'参数长度不为一

61

我正在尝试使用predict()函数通过将变量传递到模型中来预测R中的值。

但是我遇到了以下错误:

Error in eval(predvars, data, env) : 
  numeric 'envir' arg not of length one

这是我的 数据框,名称为df:

df <- read.table(text = '
     Quarter Coupon      Total
1   "Dec 06"  25027.072  132450574
2   "Dec 07"  76386.820  194154767
3   "Dec 08"  79622.147  221571135
4   "Dec 09"  74114.416  205880072
5   "Dec 10"  70993.058  188666980
6   "Jun 06"  12048.162  139137919
7   "Jun 07"  46889.369  165276325
8   "Jun 08"  84732.537  207074374
9   "Jun 09"  83240.084  221945162
10  "Jun 10"  81970.143  236954249
11  "Mar 06"   3451.248  116811392
12  "Mar 07"  34201.197  155190418
13  "Mar 08"  73232.900  212492488
14  "Mar 09"  70644.948  203663201
15  "Mar 10"  72314.945  203427892
16  "Mar 11"  88708.663  214061240
17  "Sep 06"  15027.252  121285335
18  "Sep 07"  60228.793  195428991
19  "Sep 08"  85507.062  257651399
20  "Sep 09"  77763.365  215048147
21  "Sep 10"  62259.691  168862119', header=TRUE)


str(df)
'data.frame':   21 obs. of  3 variables:
 $ Quarter   : Factor w/ 24 levels "Dec 06","Dec 07",..: 1 2 3 4 5 7 8 9 10 11 ...
 $ Coupon: num  25027 76387 79622 74114 70993 ...
 $ Total: num  132450574 194154767 221571135 205880072 188666980 ...

代码:

model <- lm(df$Total ~ df$Coupon)

> model

Call:
lm(formula = df$Total ~ df$Coupon)

Coefficients:
(Intercept)    df$Coupon  
  107286259         1349 

现在,当我运行predict时,我得到了上面显示的错误。

> predict(model, df$Total, interval="confidence")
Error in eval(predvars, data, env) : 
  numeric 'envir' arg not of length one
任何想法我错在哪里了吗? 谢谢。
1个回答

51

这里有几个问题:

  1. predict()newdata参数需要一个预测器变量。因此,您应该传递Coupon的值作为此参数,而不是模型中的响应变量Total

  2. 预测变量需要作为数据框中的一个命名列传递进来,以便predict()知道其所传递的数字代表什么。(当考虑到拥有多个预测变量的更复杂模型时,这种需求变得更加明显)。

  3. 为了使它能够工作,您在最初调用时应通过data参数传递df,而不是直接在公式中使用它。(这样,newdata中列的名称将能够与公式右侧的名称匹配)。

经过这些更改后,这将起作用:

model <- lm(Total ~ Coupon, data=df)
new <- data.frame(Coupon = df$Coupon)
predict(model, newdata = new, interval="confidence")

6
他们不一定需要从原始数据框中传递“Coupon”值。也许他们真的想预测在“Total”值处的响应。但是这些值必须在名为“Coupon”的某个内容中,以便与模型匹配。 - joran
5
@joran -- 感谢您提出这个观点。通常情况下,您希望传入Coupon的值与模型拟合时使用的值不同。而当您确实需要预测模型中的某些点时,只需使用predict(model, interval="confidence")即可。 - Josh O'Brien
3
Josh:那个可能没有你想象的那样起作用!考虑一下使用 predict(model, Coupon=NA, interval="confidence") 会发生什么... - Hong Ooi
@Josh 假设我无法将 "lm" 模型结构转换为您建议的模型(使用 "data= "),因为我的变量来自两个单独的数据框架。(即,lm (mod1 $ var〜mod2 $ var))。在这种情况下,有没有办法让预测起作用? - theforestecologist
@theforestecologist 我建议你看一下reformulate()例如在这里,如果这还不足以帮助你解决问题,那么请构建一个最小可重现的示例并将其作为问题提出。有了实际的示例,这里有很多人能够快速回答你的问题。干杯! - Josh O'Brien
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接