2013-07-12 97 views
1

我期待着我在這裏忽略一些顯而易見的事情。預測的線性迴歸的預測數量不同

我試圖建立過度擬合的演示。我有一個二次生成函數,我已經繪製了20個樣本,現在我想要擬合遞增程度的多項式線性模型到採樣數據。

由於某種原因,無論我使用哪種模型,每次運行predict時,都會返回N個預測值,其中N是用於訓練模型的記錄數。無論多項式的式中的程度,其中包括簡單的情況'y~x'

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? 

這種現象是本:

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) 

這是我瘋狂。我究竟做錯了什麼?

回答

3

predict的第二個參數是newdata而不是data

此外,您不需要在模型公式中多次調用poly; poly(N)將與poly(N-1)和所有其他人共線。

另外^ 2,要使用xv生成預測序列,您必須將其放在數據框中,並使用相應的名稱:data.frame(x=xv)

+1

你是個美麗的人。是的,當我更改爲'newdata'時,我收到了警告,但我只是用'newdata = list(x = x)'修復了它們,這基本上是一樣的。認爲這很簡單。謝謝! –

+0

其實'預測(m1)'會和'預測(m1,newdata = list(x = x))一樣' –

+0

大衛,我認爲他也很漂亮:)。 – Arun