代码之家  ›  专栏  ›  技术社区  ›  Eric Fail

在非平衡面板上使用plm对聚类样本进行随机效应分析

  •  0
  • Eric Fail  · 技术社区  · 6 年前

    我通常在广义最小二乘框架下工作,估计Wooldridge的 引导的 (2013)调用、随机效应和固定效应模型对纵向数据的影响,纵向数据由个人和时间维度索引。

    我一直在用 最小二乘法 估算中 plm() ,从 包,以估计随机效应模型 混合模型 。这个 plm() 函数采用 index 参数,其中我指示个人和时间索引。然而,我现在面临的一些数据是,每个人在每个时间点都有几个衡量标准,也就是说,什么是群体结构。

    我发现使用 lmer() 然而,我对术语的差异和可能性框架有点困惑,我想知道是否正确指定了模型。我担心我可能会忽视更多的实质性内容,因为我不熟悉框架和术语。

    我可以复制我的 plm() 模型使用 lmer() ,但我不确定如何添加分组。我试着用下面的话来说明我的问题。

    我找到一些看起来有点像我的数据的数据来说明我的情况。首先是一些需要的软件包,

    install.packages(c("mlmRev", "plm", "lme4", "stargazer"), dependencies = TRUE)
    

    然后是数据

    data(egsingle, package = "mlmRev")
    

    egsingle 是一个不平衡的小组,由1721名学生组成,分为60所学校,跨越五个时间点。这些数据最初随HLM软件包分发(Bryk、Raudenbush和Congdon,1996),但可以在 软件包,有关详细信息,请参阅 ? mlmRev::egsingle

    一些轻松的数据管理

    dta <- egsingle
    dta$Female <- with(dta, ifelse(female == 'Female', 1, 0))
    

    这里有一个数据片段

    dta[118:127,c('schoolid','childid','math','year','size','Female')]
    #>     schoolid   childid   math year size Female
    #> 118     2040 289970511 -1.830 -1.5  502      1
    #> 119     2040 289970511 -1.185 -0.5  502      1
    #> 120     2040 289970511  0.852  0.5  502      1
    #> 121     2040 289970511  0.573  1.5  502      1
    #> 122     2040 289970511  1.736  2.5  502      1
    #> 123     2040 292772811 -3.144 -1.5  502      0
    #> 124     2040 292772811 -2.097 -0.5  502      0
    #> 125     2040 292772811 -0.316  0.5  502      0
    #> 126     2040 293550291 -2.097 -1.5  502      0
    #> 127     2040 293550291 -1.314 -0.5  502      0
    

    下面是我如何设置 随机效应模型 没有 schoolid 使用 plm() ,则,

    library(plm)
    reg.re.plm <- plm(math~Female+size+year, dta, index = c("childid", "year"), model="random")
    # summary(reg.re.plm)
    

    我可以复制这些结果 lme4 像这样

    require(lme4)
    dta$year <- as.factor(dta$year)
    reg.re.lmer <- lmer(math~Female+size+year+(1|childid), dta)
    # summary(reg.re.lmer)
    

    现在,从阅读 chapter 2 in Bates (2010) “lme4: Mixed-effects modeling with R” 我相信这就是我将如何具体化模型,包括集群级别, 学校ID ,则,

    reg.re.lmer.in.school <- lmer(math~Female+size+year+(1|childid)+(1|schoolid), dta)
    # summary(reg.re.lmer.in.school)
    

    然而,当我看到结果时,我并不太确信我确实正确地指定了它(见下文)。

    在我的实际数据中,重复测量是在个人内部进行的,但我可以将此数据作为示例。如能就如何进行提供任何建议,我将不胜感激。可能是引用了一个与Wooldridge(2013)中使用的符号/术语不太远的工作示例。还有,我如何反向工作并编写 reg.re.lmer.in.school 模型

    # library(stargazer)
    stargazer::stargazer(reg.re.plm, reg.re.lmer, reg.re.lmer.in.school, type="text")
    #> =====================================================================
    #>                                    Dependent variable:               
    #>                     -------------------------------------------------
    #>                                           math                       
    #>                                panel                   linear        
    #>                               linear                mixed-effects    
    #>                                 (1)                (2)        (3)    
    #> ---------------------------------------------------------------------
    #> Female                        -0.025              -0.025     0.008   
    #>                               (0.046)            (0.047)    (0.042)  
    #>                                                                      
    #> size                        -0.0004***          -0.0004***  -0.0003  
    #>                              (0.0001)            (0.0001)   (0.0002) 
    #>                                                                      
    #> year-1.5                     0.878***            0.876***   0.866*** 
    #>                               (0.059)            (0.059)    (0.059)  
    #>                                                                      
    #> year-0.5                     1.882***            1.880***   1.870*** 
    #>                               (0.059)            (0.058)    (0.058)  
    #>                                                                      
    #> year0.5                      2.575***            2.574***   2.562*** 
    #>                               (0.059)            (0.059)    (0.059)  
    #>                                                                      
    #> year1.5                      3.149***            3.147***   3.133*** 
    #>                               (0.060)            (0.059)    (0.059)  
    #>                                                                      
    #> year2.5                      3.956***            3.954***   3.939*** 
    #>                               (0.060)            (0.060)    (0.060)  
    #>                                                                      
    #> Constant                     -2.671***          -2.669***  -2.693*** 
    #>                               (0.085)            (0.086)    (0.152)  
    #>                                                                      
    #> ---------------------------------------------------------------------
    #> Observations                   7,230              7,230      7,230   
    #> R2                             0.735                                 
    #> Adjusted R2                    0.735                                 
    #> Log Likelihood                                  -8,417.815 -8,284.357
    #> Akaike Inf. Crit.                               16,855.630 16,590.720
    #> Bayesian Inf. Crit.                             16,924.490 16,666.460
    #> F Statistic         2,865.391*** (df = 7; 7222)                      
    #> =====================================================================
    #> Note:                                     *p<0.1; **p<0.05; ***p<0.01
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Eric Fail    6 年前

    学习之后 Robert Long's great answer on stats.stackexchange 我发现模型的正确规格是嵌套设计,即。 (1| schoolid /childid) . 但是,由于数据的编码方式(Unnique childid 内的 schoolid )交叉设计或规范,即。 (1|childid)+(1|schoolid) 我在上面使用的方法,得到了相同的结果。

    以下是使用上述相同数据的图示,

    data(egsingle, package = "mlmRev")
    dta <- egsingle
    dta$Female <- with(dta, ifelse(female == 'Female', 1, 0))
    
    require(lme4)
    dta$year <- as.factor(dta$year)
    

    重新运行交叉设计模型, reg.re.lmer.in.school ,用于比较

    reg.re.lmer.in.school <- lmer(math~Female+size+year+(1|childid)+(1|schoolid), dta)
    

    这里是嵌套结构

    reg.re.lmer.nested <- lmer(math~Female+size+year+(1| schoolid /childid), dta)
    

    最后使用惊人的 包裹

    # install.packages(c("texreg"), dependencies = TRUE)
    #  require(texreg)
    texreg::screenreg(list(reg.re.lmer.in.school, reg.re.lmer.nested), digits = 3)
    #> ===============================================================
    #>                                    Model 1        Model 2      
    #> ---------------------------------------------------------------
    #> (Intercept)                           -2.693 ***     -2.693 ***
    #>                                       (0.152)        (0.152)   
    #> Female                                 0.008          0.008    
    #>                                       (0.042)        (0.042)   
    #> size                                  -0.000         -0.000    
    #>                                       (0.000)        (0.000)   
    #> year-1.5                               0.866 ***      0.866 ***
    #>                                       (0.059)        (0.059)   
    #> year-0.5                               1.870 ***      1.870 ***
    #>                                       (0.058)        (0.058)   
    #> year0.5                                2.562 ***      2.562 ***
    #>                                       (0.059)        (0.059)   
    #> year1.5                                3.133 ***      3.133 ***
    #>                                       (0.059)        (0.059)   
    #> year2.5                                3.939 ***      3.939 ***
    #>                                       (0.060)        (0.060)   
    #> ---------------------------------------------------------------
    #> AIC                                16590.715      16590.715    
    #> BIC                                16666.461      16666.461    
    #> Log Likelihood                     -8284.357      -8284.357    
    #> Num. obs.                           7230           7230        
    #> Num. groups: childid                1721                       
    #> Num. groups: schoolid                 60             60        
    #> Var: childid (Intercept)               0.672                   
    #> Var: schoolid (Intercept)              0.180          0.180    
    #> Var: Residual                          0.334          0.334    
    #> Num. groups: childid:schoolid                      1721        
    #> Var: childid:schoolid (Intercept)                     0.672    
    #> ===============================================================
    #> *** p < 0.001, ** p < 0.01, * p < 0.05