我有一个循环需要执行;其中有6个模型。然后,需要将这些模型所存储的对象传递给执行AIC分析的函数。但是,有时其中一个模型不起作用,这会中断AIC函数的代码,因为它无法识别出由于未存储为对象而失败的任何模型。
因此,我需要一种方法将适用于AIC功能的那些模型提取出来。
这里是一个示例,但是请记住,所有这些都可以在循环内执行是很重要的。这是三个假设模型:
.config(function () { ionic.Platform.setPlatform('android'); })
这将是我的AIC函数来比较模型:
hn.1 <- ds(data)
hn.1.obs <- ds(data,formula = ~OBSCODE)
hn.1.obs.mas <- ds(dataformula = ~OBSCODE+MAS)
但是如果说hn.1.obs.mas模型失败,我会报错。
我尝试使用“ get”和“ ls”,并成功提取了调用时存在的模型:
summarize_ds_models(hn.1, hn.1.obs, hn.1.obs.mas)
但这只是返回一个字符向量,所以当我调用时:
get(ls(pattern='hn.15*'))
仅对上述字符向量中的第一个模型进行AIC分析。
我是在正确的轨道上吗,还是有更好的方法来做到这一点?
带有可复制示例的更新。
这是我的问题的简化版本:
创建并填充将放入列表中的两个数据框:
summarize_ds_models(get(ls(pattern='hn.15*')))
创建df以填充AIC分析中的最佳模型
data.frame <- data.frame(x = integer(4),
y = integer(4),
z = integer(4),
i = integer(4))
data.frame$x <- c(1,2,3,4)
data.frame$y <- c(1,4,9,16)
data.frame$z <- c(1,3,8,10)
data.frame$i <- c(1,5,10,15)
data.frame.2 <- data.frame[1:4,1:3]
my.list <- list(data.frame,data.frame.2)
以下是将运行循环的函数:
bestmodels <- data.frame(modelname = character(2))
但是,在循环的第二次迭代中,AIC功能将失败,因为mod.3将失败。那么,有没有一种通用的方法可以使AIC函数仅对有效的那些模型执行?我想在这里得到的结果是:
myfun <- function(list) {
for (i in 1:length(my.list)){
mod.1 = lm(y ~ x, data = my.list[[i]])
mod.2 = lm(y ~ x + z, data = my.list[[i]])
mod.3 = lm(y ~ i, data = my.list[[i]])
bestmodels[i,1] <- rownames(AIC(mod.1,mod.2,mod.3))[1]#bestmodel is 1st row
}
print(bestmodels)
}
因为两个AIC分析都将选择mod.1。
答案 0 :(得分:0)
格雷戈的评论:
使用列表而不是单独的命名对象。然后do.call(summarize_ds_models,my_list_of_models)。如果尚未完成,则可以先过滤列表,以确保仅工作模型在列表中。
解决了我的问题。谢谢