首页 > 解决方案 > 仅当对象存在时才在函数中包含对象

问题描述

我有一个需要执行的循环;其中有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。

标签: r

解决方案


格雷戈尔的评论:

使用列表而不是单个命名对象。然后 do.call(summarize_ds_models, my_list_of_models)。如果尚未完成,您可以先筛选列表以确保列表中只有工作模型。

解决了我的问题。谢谢


推荐阅读