如何解决R-根据对象的名称将对象传递给函数
假设在R中,我有来自多个glm()
函数调用的多个GLM对象。
glm_01
glm_02
...
glm_nn
...并且假设我想使用卡方检验或F ANOVA检验进行所有可能的成对比较。
anova(glm_01,glm_02,test = "F")
anova(glm_01,glm_03,glm_04,test = "F")
...
我不想手动执行此操作,因为模型列表很长。相反,我想获取相关模型对象的列表(以"glm_"
开头的任何对象)并自动进行所有成对比较。但是,我不确定如何将模型对象(而不是以字符串形式的名称)传递给anova()
函数。
作为一个简单的例子:
data(mtcars)
# create some models
glm_01 <- glm(mpg ~ cyl,mtcars,family = gaussian())
glm_02 <- glm(mpg ~ cyl + disp,family = gaussian())
glm_03 <- glm(mpg ~ cyl + disp + hp,family = gaussian())
glm_04 <- glm(mpg ~ cyl + disp + hp + wt,family = gaussian())
# get list of relevant model objects from the R environment
model_list <- ls()
model_list <- model_list[substr(model_list,1,4) == "glm_"]
# create a table to store the pairwise ANOVA results
n_models <- length(model_list)
anova_table <- matrix(0,nrow = n_models,ncol = n_models)
# loop through twice and do pairwise comparisons
for(row_index in 1:n_models) {
for(col_index in 1:n_models) {
anova_table[row_index,col_index] <- anova(model_list[row_index],model_list[col_index],test = "F")$'Pr(>F)'[2]
}
}
...但是,当然,最后的循环不起作用,因为我没有将模型对象传递给anova()
,而是将对象的名称传递为字符串。如何告诉anova()
使用字符串引用的对象,而不是字符串本身?
谢谢。
=====================
可能的解决方案:
data(mtcars)
glm_list <- list()
glm_list$glm_01 <- glm(mpg ~ cyl,family = gaussian())
glm_list$glm_02 <- glm(mpg ~ cyl + disp,family = gaussian())
glm_list$glm_03 <- glm(mpg ~ cyl + disp + hp,family = gaussian())
glm_list$glm_04 <- glm(mpg ~ cyl + disp + hp + wt,family = gaussian())
# create a table to store the pairwise ANOVA results
n_models <- length(glm_list)
anova_table <- matrix(0,ncol = n_models)
# loop through twice and do pairwise comparisons
row_idx <- 0
col_idx <- 0
for(row_glm in glm_list)
{
row_idx <- row_idx + 1
for(col_glm in glm_list)
{
col_idx <- col_idx + 1
anova_table[row_idx,col_idx] <- anova(row_glm,col_glm,test = "F")$'Pr(>F)'[2]
}
col_idx <- 0
}
row_idx <- 0
解决方法
最简单的方法是将所有模型保存在列表中。这样可以很容易地遍历它们。例如,您可以创建所有模型,并在所有模型之间进行成对比较,如下所示:
data(mtcars)
f_list <- list(mpg ~ cyl,mpg ~ cyl + disp,mpg ~ cyl + disp + hp,mpg ~ cyl + disp + hp + wt)
all_glms <- lapply(f_list,glm,data = mtcars,family = gaussian)
all_pairs <- as.data.frame(combn(length(all_glms),2))
result <- lapply(all_pairs,function(i) anova(all_glms[[i[1]]],all_glms[[i[2]]]))
哪个给你:
result
#> $V1
#> Analysis of Deviance Table
#>
#> Model 1: mpg ~ cyl
#> Model 2: mpg ~ cyl + disp
#> Resid. Df Resid. Dev Df Deviance
#> 1 30 308.33
#> 2 29 270.74 1 37.594
#>
#> $V2
#> Analysis of Deviance Table
#>
#> Model 1: mpg ~ cyl
#> Model 2: mpg ~ cyl + disp + hp
#> Resid. Df Resid. Dev Df Deviance
#> 1 30 308.33
#> 2 28 261.37 2 46.965
#>
#> $V3
#> Analysis of Deviance Table
#>
#> Model 1: mpg ~ cyl
#> Model 2: mpg ~ cyl + disp + hp + wt
#> Resid. Df Resid. Dev Df Deviance
#> 1 30 308.33
#> 2 27 170.44 3 137.89
#>
#> $V4
#> Analysis of Deviance Table
#>
#> Model 1: mpg ~ cyl + disp
#> Model 2: mpg ~ cyl + disp + hp
#> Resid. Df Resid. Dev Df Deviance
#> 1 29 270.74
#> 2 28 261.37 1 9.3709
#>
#> $V5
#> Analysis of Deviance Table
#>
#> Model 1: mpg ~ cyl + disp
#> Model 2: mpg ~ cyl + disp + hp + wt
#> Resid. Df Resid. Dev Df Deviance
#> 1 29 270.74
#> 2 27 170.44 2 100.3
#>
#> $V6
#> Analysis of Deviance Table
#>
#> Model 1: mpg ~ cyl + disp + hp
#> Model 2: mpg ~ cyl + disp + hp + wt
#> Resid. Df Resid. Dev Df Deviance
#> 1 28 261.37
#> 2 27 170.44 1 90.925
由reprex package(v0.3.0)于2020-08-25创建
,如果要通过符号引用可访问环境中的任意对象而不将它们放入列表对象中,则返回符号等于字符串的搜索列表中顶部对象的标准方法是get()
,或等效向量mget()
。即get("glm_01")
将使您成为搜索列表中带有符号glm_01
的顶部对象。对方法进行的最小改动是将对model_list[row_index]
和model_list[col_index]
的调用包装在get()
中。
通过在命名环境中分配模型并仅在该环境中get
(使用envir
参数到get()
)分配模型,可以更精确地查找对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。