r - 仅当对象存在时才在函数中包含对象
问题描述
我有一个需要执行的循环;其中有6个模型。然后需要将存储这些模型的对象传递给执行 AIC 分析的函数。但是,有时其中一个模型不起作用,这会破坏 AIC 函数的代码,因为它无法识别任何失败的模型,因为它没有存储为对象。
所以,我需要一种方法来将这些模型提取到 AIC 函数中。
这是一个示例,但请记住,这一切都可以在循环中执行,这一点很重要。以下是三个假设模型:
hn.1 <- ds(data)
hn.1.obs <- ds(data,formula = ~OBSCODE)
hn.1.obs.mas <- ds(dataformula = ~OBSCODE+MAS)
这将是我比较模型的 AIC 函数:
summarize_ds_models(hn.1, hn.1.obs, hn.1.obs.mas)
但是如果说 hn.1.obs.mas 模型失败,我会收到错误消息。
我尝试使用“get”和“ls”,并成功提取了调用时存在的模型:
get(ls(pattern='hn.15*'))
但这只是返回一个字符向量,所以当我调用时:
summarize_ds_models(get(ls(pattern='hn.15*')))
它只对上述特征向量中的第一个模型进行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)
创建 df 以填充来自 AIC 分析的最佳模型
bestmodels <- data.frame(modelname = character(2))
这是将运行循环的函数:
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.3 将失败。那么,是否有一种通用的方法可以使 AIC 函数只对那些有效的模型执行?我想要的结果是:
> bestmodels
modelname
1 mod.1
2 mod.1
因为两个 AIC 分析都将选择 mod.1。
解决方案
格雷戈尔的评论:
使用列表而不是单个命名对象。然后 do.call(summarize_ds_models, my_list_of_models)。如果尚未完成,您可以先筛选列表以确保列表中只有工作模型。
解决了我的问题。谢谢
推荐阅读
- azure - Oozie 协调器无法在基于时间的触发器期间启动工作流
- php - php preg_replace 替换文本文件中的空格
- mysql - 如何在 MySql 中解决这个 GROUP BY 问题?
- java - JPA Criteria API 获取具有特定父属性值的实体
- c++ - 向 googletest 添加依赖项?
- html - CSS:色块的奇怪边缘
- android - @firebase/firestore:Firestore (7.6.0):无法访问 Cloud Firestore 后端。后端在 10 秒内没有响应
- elasticsearch - 没有post body的Elasticsearch请求查询(不允许添加body)
- c# - .Net Core 多项目 docker build
- haskell - 为什么 Data.Time.Clock.POSIX 中的 getCurrentTime 函数不能按预期工作?