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
相关产品推荐
相关产品推荐

