R-根据对象的名称将对象传递给函数

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-