【问题标题】:Plots based on models with clustered SEs基于具有聚类 SE 的模型的图
【发布时间】:2019-09-23 02:57:21
【问题描述】:

我正在尝试基于具有聚集标准误差的回归模型创建图。根据数据集的大小,我通常使用来自"lfe" 包的felm 或来自"multiwayvcov""lmtest" 包的cluster.vcovcoeftest 对标准错误进行聚类。

以下是使用这两种方法可能会出现的回归示例:

# Load Packages
library('lfe')
library('multiwayvcov')
library('lmtest')
data(mtcars)

# Using felm
m1 <- felm(mpg ~ wt + disp + wt*disp | 0 | 0 | carb, data=mtcars)

# multiwayvcov
m2 <- glm(mpg ~ wt + disp + wt*disp, data=mtcars)
er2 <- cluster.vcov(m2, mtcars, 'carb')
m2ct <- coeftest(m2, er2)

问题在于这两个选项产生的对象类型与 R 中的大多数绘图功能不兼容。

例如,如果我试图创建这样的情节:

interplot(m=m2, var1='wt', var2='disp', ci=.9, ralpha=.3, rfill='dodgerblue1') +
  geom_hline(yintercept=0, linetype="dashed") +
  guides(colour=guide_legend(override.aes=list(size=3)))

如何从这些具有聚集标准误差的模型中创建具有正确置信区间的图?

【问题讨论】:

    标签: r ggplot2 lm


    【解决方案1】:

    miceadds 包中有一个 glm.cluster 函数,它适合具有集群稳健标准错误的 GLM,并且似乎类似于 felmresults。

    library(miceadds)
    m.glm.cl <- glm.cluster(mpg ~ wt + disp + wt*disp, cluster="carb", data=mtcars)
    summary(m.glm.cl)
    #                Estimate  Std. Error    t value      Pr(>|t|)
    # (Intercept) 44.08199770 1.960767641  22.482010 6.225590e-112
    # wt          -6.49567966 0.635946018 -10.214200  1.712866e-24
    # disp        -0.05635816 0.009436760  -5.972194  2.340843e-09
    # wt:disp      0.01170542 0.001965829   5.954445  2.609566e-09
    
    library('lfe')
    m.felm <- felm(mpg ~ wt + disp + wt*disp | 0 | 0 | carb, data=mtcars)
    summary(m.felm)$coef
    #                Estimate Cluster s.e.    t value     Pr(>|t|)
    # (Intercept) 44.08199770  1.960767641  22.482010 1.846712e-19
    # wt          -6.49567966  0.635946018 -10.214200 6.015931e-11
    # disp        -0.05635816  0.009436760  -5.972194 1.972266e-06
    # wt:disp      0.01170542  0.001965829   5.954445 2.068825e-06
    

    p 值不同,但是,我不知道它们是否/如何在 interplot 中使用(您可能可以通过查看 interplot 的方法来弄清楚这一点使用:interplot::interplot.default)。

    无论如何,glm.cluster 返回一个列表,其中glm_res 是我们正在寻找的,

    names(m.glm.cl)
    # [1] "glm_res" "vcov"
    

    以及我们可以为interplot 提供什么。

    library("interplot")
    interplot(m=m.glm.cl$glm_res, var1='wt', var2='disp', ci=.9, ralpha=.3, rfill='dodgerblue1') +
      geom_hline(yintercept=0, linetype="dashed") +
      guides(colour=guide_legend(override.aes=list(size=3)))
    

    【讨论】:

    • 非常感谢您的回复,glm.cluster 函数确实生成了正确的模型!但是,在进一步研究之后,我认为glm_res 中的结果不是我想要的。在您的示例中,summary(m.glm.cl) 产生的 p 值来自带有聚类错误的模型,但 summary(m.glm.cl$glm_res) 中的 p 值似乎来自常规 glm 模型 W/O 聚类(p 值明显更小并匹配仅运行一个简单的glm() 命令产生的结果)。仍然坚持这一点。
    • 这并不完全正确,简单的 glm 会产生不同的 p 值。您可以使用2 * pt(-abs(summary(m.glm.cl)[, 3]), df=m.glm.cl$glm_res$df.residual) 轻松地手动计算 p 值,这会产生与felm 完全相同的值。可能interplot 使用协方差来计算置信区间,您可以检查interplot:::interplot.default 来确定。您可以报告felm 结果并使用lm.cluster 进行绘图。不管怎样,我已经为你准备好了opened an issue at the author's github
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2021-03-28
    • 2012-02-21
    • 2011-05-28
    相关资源
    最近更新 更多