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

R语言用purrr+coeftest提取稳健估计量报错排查

我来帮你排查这个问题哈~

问题出在哪?

你用ls(pattern="r.dnd1.1.")提取到的其实是模型名称的字符向量(比如"r.dnd1.1.1"、"r.dnd1.1.11"这种字符串),而不是你实际构建的lm模型对象本身。当你把这些字符串传给map和coeftest时,coeftest需要的是lm生成的模型对象(里面包含回归结果的各种组件),不是字符串,自然就会抛出$ operator is invalid for atomic vectors的错误——因为它在尝试对字符串(属于原子向量)用$访问模型的内部组件,这肯定行不通。

怎么解决?

给你两种简单可行的方案:

方案1:用mget直接获取模型对象列表

mget可以根据字符向量里的名称,从当前环境中取出对应的实际对象,一步到位:

# 先拿到模型名称的字符向量
r.mod_names <- ls(pattern="r.dnd1.1.")
# 用mget取出对应的模型对象列表
r.mod_objects <- mget(r.mod_names)
# 批量执行coeftest
test <- map(r.mod_objects, ~coeftest(.x, vcov=vcovHC))

方案2:在map里用get转换字符串为对象

如果不想提前生成对象列表,也可以在map的匿名函数里用get()把字符串转换成对应的模型对象:

r.mod <- ls(pattern="r.dnd1.1.")
test <- map(r.mod, ~coeftest(get(.x), vcov=vcovHC))
额外小建议:更规范的模型管理

其实在一开始构建模型的时候,直接把模型存入列表会更省心,避免后续还要从环境中提取的麻烦:

# 初始化一个空列表用来存模型
model_list <- list()
# 逐个添加模型到列表里
model_list[["model1"]] <- lm(m.mortf ~ year*tg, data=subset(data, hosptg != '3' ), na.action = na.omit, weights = n)
model_list[["model2"]] <- lm(m.mortf ~ quarter.adm*tg, data=subset(data, year %in% c('2011', '2012', '2013') & hosptg != '3' ), na.action = na.omit, weights = n)
# 直接对列表批量处理
test <- map(model_list, ~coeftest(.x, vcov=vcovHC))

这样后续调用、修改或者扩展模型都会更方便,也不容易出现类似的对象类型错误。

内容的提问来源于stack exchange,提问作者chrischi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:00:00