仅在函数中包含对象的情况下

时间:2019-03-14 21:29:01

标签: r

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

1 个答案:

答案 0 :(得分:0)

格雷戈的评论:

使用列表而不是单独的命名对象。然后do.call(summarize_ds_models,my_list_of_models)。如果尚未完成,则可以先过滤列表,以确保仅工作模型在列表中。

解决了我的问题。谢谢