You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:30:26