2017-09-25 43 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