使用purrr::map迭代lmtest::coeftest时cluster参数调用变量报错求助
解决purrr::map迭代中coeftest指定cluster参数报错的问题
问题原因
用purrr::map结合公式语法(~ glm(..., data = .))创建模型时,模型对象的call属性会记录data = .。而vcovCL在解析cluster = ~cyl这一公式时,会尝试到原始环境中查找符号.,但该符号仅存在于map的迭代环境内,因此触发object '.' not found错误。
解决方案
以下三种方法均可解决该问题:
方法1:用map2同时传递模型与对应数据集
通过map2将每个模型与其对应的数据集绑定,在coeftest中明确指定data参数,让vcovCL直接从传入的数据集中读取聚类变量:
data("mtcars") library(tidyverse) library(purrr) library(lmtest) library(sandwich) form <- formula(vs ~ hp + cyl) data_list <- mtcars %>% split(.$am) # 创建模型列表 m2 <- map(data_list, ~ glm(formula = form, family=binomial(link="logit"), data = .)) # 同时迭代模型和数据集 result <- map2(m2, data_list, ~ coeftest(.x, vcov = vcovCL, type = "HC0", cluster = ~cyl, data = .y)) # 查看结果 result
方法2:创建模型时使用具体数据集对象
用imap(带名称的迭代函数)创建模型,让模型的data参数指向具体的数据集对象,而非符号.:
data_list <- mtcars %>% split(.$am) %>% set_names(c("am_0", "am_1")) # 基于命名数据集创建模型,data指向具体对象 m2 <- imap(data_list, ~ glm(formula = form, family=binomial(link="logit"), data = data_list[[.y]])) # 直接迭代模型即可 result <- map(m2, ~ coeftest(., vcov = vcovCL, type = "HC0", cluster = ~cyl)) result
方法3:直接传递聚类变量向量
跳过公式语法,直接从模型对象中提取聚类变量的向量传递给cluster参数:
result <- map(m2, ~ coeftest(., vcov = vcovCL, type = "HC0", cluster = .$model$cyl)) result
内容的提问来源于stack exchange,提问作者edo
相关产品推荐
相关产品推荐

