首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象传递给基于对象名称的函数。

将对象传递给基于对象名称的函数。
EN

Stack Overflow用户
提问于 2020-08-25 11:00:29
回答 1查看 51关注 0票数 0

假设在R中有来自多个glm()函数调用的多个GLM对象。

代码语言:javascript
复制
glm_01
glm_02
...
glm_nn

...and假设我想做所有可能的两两比较,使用的是X平方或F方差分析。

代码语言:javascript
复制
anova(glm_01, glm_02, test = "F")
anova(glm_01, glm_03, test = "F")
anova(glm_01, glm_04, test = "F")
...

我不想手动这样做,因为模型的列表很长。相反,我想获取相关模型对象的列表(以"glm_"开头的任何内容),并自动进行所有成对比较。但是,我不确定如何将模型对象(而不是字符串形式的名称)传递给anova()函数。

作为一个简单的例子:

代码语言:javascript
复制
data(mtcars)

# create some models

glm_01 <- glm(mpg ~ cyl                 , mtcars, family = gaussian())
glm_02 <- glm(mpg ~ cyl + disp          , mtcars, family = gaussian())
glm_03 <- glm(mpg ~ cyl + disp + hp     , mtcars, family = gaussian())
glm_04 <- glm(mpg ~ cyl + disp + hp + wt, mtcars, 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]
  }
}

当然,最后的...but循环不能工作,因为我不是将模型对象传递给anova(),而是将对象的名称作为字符串传递。如何告诉anova()使用字符串引用的对象,而不是字符串本身?

谢谢。

======================

可能的解决办法:

代码语言:javascript
复制
data(mtcars)

glm_list <- list()

glm_list$glm_01 <- glm(mpg ~ cyl                 , mtcars, family = gaussian())
glm_list$glm_02 <- glm(mpg ~ cyl + disp          , mtcars, family = gaussian())
glm_list$glm_03 <- glm(mpg ~ cyl + disp + hp     , mtcars, family = gaussian())
glm_list$glm_04 <- glm(mpg ~ cyl + disp + hp + wt, mtcars, family = gaussian())

# create a table to store the pairwise ANOVA results

n_models <- length(glm_list)
anova_table <- matrix(0, nrow = n_models, 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
EN

回答 1

Stack Overflow用户

发布于 2020-08-25 12:18:13

如果要通过符号引用可访问环境中的任意对象而不将其放入列表对象中,则返回符号等于字符串的搜索列表中的顶级对象的标准方法是get()或向量等效mget()。也就是说,get("glm_01")会为您提供搜索列表中具有符号glm_01的顶级对象。对您的方法的最微小的修改将是将您对model_list[row_index]model_list[col_index]的调用封装在get()中。

您可以通过指定环境中的模型来更精确地查找对象,并且只从该环境中分配get(将envir参数分配给get())。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63577425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档