【问题标题】:Different number of predictions than expecting in linear regression [duplicate]与线性回归中预期的预测数量不同[重复]
【发布时间】:2013-07-12 19:11:49
【问题描述】:

我预计我在这里遗漏了一些明显的东西。

我正在尝试构建过度拟合的演示。我有一个二次生成函数,从中抽取了 20 个样本,现在我想将递增程度的多项式线性模型拟合到采样数据。

出于某种原因,无论我使用哪种模型,每次运行 predict 时,我都会返回 N 个预测,其中 N 是用于训练我的模型的记录数。

set.seed(123)
N=20
xv = seq(1,5,length.out=1e4)
x=sample(xv,N)
gen=function(v){v^2 + 2*rnorm(length(v))}
y=gen(x)
df = data.frame(x,y)

# convenience function for building formulas for polynomial regression
build_formula = function(N){ 
  fpart = paste(lapply(2:N, function(i) {paste('+ poly(x,',i,',raw=T)')}  ), collapse="")
  paste('y~x',fpart)
}
## Example:
## build_formula(4)="y~x + poly(x, 2 ,raw=T)+ poly(x, 3 ,raw=T)+ poly(x, 4 ,raw=T)"



model = lm(build_formula(10), data=df)
predict(model, data=xv) # returns 20 values instead of 1000
predict(model, data=1)  # even *this* spits out 20 results. WTF?

无论公式中多项式的次数如何,都会出现这种行为,包括平凡的情况'y~x'

formulas = sapply(c(2,10,20), build_formula)
formulas = c('y~x', formulas)
pred = lapply(formulas
              ,function(f){
                predict(
                  lm(f, data=df)
                  ,data=xv)
              })

lapply(pred, length) # 4 x 20 predictions, expecting 4 x 1000

# unsuccessful sanity check
m1 = lm('y~x', data=df)
predict(m1,data=xv)

这让我发疯了。我做错了什么?

【问题讨论】:

    标签: r linear-regression lm predict


    【解决方案1】:

    predict 的第二个参数是 newdata,而不是 data

    此外,您不需要在模型公式中多次调用polypoly(N) 将与 poly(N-1) 和所有其他人共线。

    另外^2,要使用xv 生成预测序列,您必须将其放入具有适当名称的数据框中:data.frame(x=xv)

    【讨论】:

    • 你是一个美丽的人。是的,当我更改为newdata 时,我收到了警告,但我只是用newdata=list(x=x) 修复了它们,这基本上是一样的。以为这很简单。谢谢!
    • 其实predict(m1)predict(m1, newdata=list(x=x))是一样的
    • 大卫,我也觉得他很漂亮:)。
    • @DWin 很高兴知道,但这不是我想要做的。哦,我明白你为什么提出这个问题了,我的意思是我使用了list(x=xv)。那是上面的一个错字。我的错。
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多