2017-09-25 48 views
2

預測考慮到可以通過創建模型列表:機型不能在

fits = vector(mode="list",length=10) 
for(i in 1:10) 
{ 
    fits[[i]] = lm(nox~poly(dis,i),data=Boston) 
} 

其中,用於Boston數據集,可以在MASS庫中找到。現在
,爲了做出預測:

dislim = range(Boston$dis) 
dis.grid = seq(from = dislim[1],to = dislim[2],by = 0.1) 

這樣做是爲了給在其nox的值預測的dis值。 現在,爲了作出預測,我們可以做到以下幾點:

predict(fits[[1]],list(dis = dis.grid)) 

但是這將導致一個錯誤:

Error: variable 'poly(dis, i)' was fitted with type "nmatrix.1" but type "nmatrix.10" was supplied 
In addition: Warning message: 
In Z/rep(sqrt(norm2[-1L]), each = length(x)) : 
    longer object length is not a multiple of shorter object length 

但是,當我做到以下幾點:

lm.Boston = lm(nox~poly(dis,3),data=Boston) 
lm.Boston.pred = predict(lm.Boston,list(dis = dis.grid)) 

它工作正常。那麼,爲什麼我不能在列表中這樣做呢?

回答

3

指定一個動態式正確的方法是使用pasteas.formula

library(MASS) 
data(Boston) 

dislim <- range(Boston$dis) 
dis.grid <- seq(from = dislim[1],to = dislim[2],by = 0.1) 

models <- lapply(1:10, function(i){ 
    form = as.formula(paste0("nox~", "poly(dis," , i, ")")) 
    lm(form, data=Boston) 
}) 

預測

lapply(models, function(x){ 
    predict(x, list(dis = dis.grid)) 
}) 

編輯:另一種方法來構建式(按照MrFlick評論)爲:

`lm(bquote(nox~poly(dis,.(i))), data=Boston)` 

models1 <- lapply(1:10, function(i){ 
    lm(bquote(nox~poly(dis,.(i))), data=Boston) 
}) 

此外(按照Natha Ñ韋斯評語)如果所述製劑:

models2 <- lapply(1:10, function(i){ 
    lm(nox~poly(dis,i),data=Boston) 
}) 

被使用時,i被視爲在模型中的變量,並且可以利用下列方式這樣的行爲:

predict(models2[[1]], list(dis = dis.grid, i = 1) 

library(purrr) 
models <- lapply(1:10, function(i){ 
    form = as.formula(paste0("nox~", "poly(dis," , i, ")")) 
    lm(form, data=Boston) 
}) 

models1 <- lapply(1:10, function(i){ 
    lm(bquote(nox~poly(dis,.(i))), data=Boston) 
}) 

models2 <- lapply(1:10, function(i){ 
    lm(nox~poly(dis,i),data=Boston) 
}) 

missuse <- lapply(models, function(x){ 
    predict(x,list(dis = dis.grid)) 
}) 

MrFlick <- lapply(models1, function(x){ 
    predict(x,list(dis = dis.grid)) 
}) 

NathanWerth <- purrr::map2(models2, 1:10, function(x, y){ 
    predict(x,list(dis = dis.grid, i = y)) 
}) 

purrr::pmap(list(missuse, MrFlick, NathanWerth), function(x, y, z) c(identical(x, y), identical(x, z))) 
+1

要展開對此,@ mooncrater代碼的問題是'poly(dis,i)'中的'i'被捕獲爲模型中的一個變量。因此,可以使用像predict(fits [[1]],list(dis = dis.grid,i = 1))這樣的每個模型。但這不是很有用。 –

+1

你也可以用'lm(bquote(nox〜poly(dis,。(i))),data = Boston)'而不是'paste()'來建立公式。 – MrFlick