随机效应多项式logit与Stata的边际效应

随机效应多项式logit与Stata的边际效应,stata,logistic-regression,multinomial,Stata,Logistic Regression,Multinomial,我有一些数据,参与者可以从三个选项中选择一个来回答一些相关的问题。在分析的一部分中,我将所有这些答案结合起来,这样我就可以从每个参与者那里得到一些观察结果。我对此进行建模的方法是使用多项式logit,参与者ID作为随机效应。然后,我使用gllamm对模型进行了估算 我现在陷入的困境是,我似乎无法从这种回归中提取边际效应。到目前为止,我的搜索结果表明,解决方法包括gllapred,mu-marg。然而,运行它似乎返回在我的样本中选择特定选项的总体概率。相反,我想了解我的一个虚拟变量(例如男性)的变

我有一些数据,参与者可以从三个选项中选择一个来回答一些相关的问题。在分析的一部分中,我将所有这些答案结合起来,这样我就可以从每个参与者那里得到一些观察结果。我对此进行建模的方法是使用多项式logit,参与者ID作为随机效应。然后,我使用
gllamm
对模型进行了估算

我现在陷入的困境是,我似乎无法从这种回归中提取边际效应。到目前为止,我的搜索结果表明,解决方法包括
gllapred,mu-marg
。然而,运行它似乎返回在我的样本中选择特定选项的总体概率。相反,我想了解我的一个虚拟变量(例如男性)的变化如何改变做出特定选择的概率


假设对于这种类型的对象,没有办法获得类似于
margins
的输出,有没有办法手动获得边缘效果?也就是说,我能估计出男性=0,男性=1,然后取差值吗?我感兴趣的变量是傻瓜,但我确实有一个连续变量(年龄),我大概不能这样估计——然而,我也对它的边际效应不太感兴趣。

我也在学习
gllam
,最后我开始做这个小例子,希望对讨论有所帮助(即使对于OP最初的需求来说已经太晚了)

该示例做了三件事:

  • 使用
    e(b)
    的结果计算 二分法变量(基于优势比;需要对 概率
  • 演示来自
    gllapred varname的结果,
    mu marg
    方法,不符合我们的利益
  • 比较估计独立(和相关)随机变量的扩展方法 对不同反应的影响以及产生不同反应的“幼稚”方法 只有一个随机截获
  • 这类模型的一个有用参考是
    gllamm
    早期版本的第9.3节

    首先是一些假数据。希望这符合OP的描述

    clear
    set more off
    input id q1 q2 q3 q4 age female
    1 3 1 2 3 10 1
    2 3 1 2 3 12 0 
    3 3 3 1 1 11 0
    4 1 1 2 3 9  1
    5 1 3 1 1 10 1
    6 2 3 1 2 11 1
    7 2 1 1 3 11 1
    8 2 1 3 3 11 1
    9 1 2 3 1 11 1
    10 1 2 3 1 11 1
    11 2 1 3 2 12 0
    12 3 1 1 2 12 1
    13 2 1 2 3 12 0
    14 2 1 1 1 12 0
    15 3 2 1 1 12 0
    end
    reshape long q, i(id) j(item)
    
    这是一个“幼稚”模型,仅产生一个随机效应方差,尽管对响应=2(对1)和响应=3(对1)的结果分别进行了估计

    正如OP所指出的,
    gllapred varname,mu marg
    方法基本上预测每个个体在每个响应中的概率。尽管名称相似,但这与Stata的
    margins
    命令不同

    // The -gllapred- approach
    gllapred x1,outcome(1) mu marginal
    gllapred x2,outcome(2) mu marginal
    gllapred x3,outcome(3) mu marginal
    sort id item
    list id item q x1 x2 x3 // same probability for the same individual; x1+x2+x3=1
    
    但是,我们可以使用
    e(b)
    的结果手动估计当其他协变量固定时
    女性的边际效应

    // fix age at mean
    su age, meanonly // average age
    loca mean_age=r(mean)
    
    然后我们手动减去每个反应的两个预测优势比

    // response: c2
    loca c2m=exp(_coef[c2:age]*`mean_age'+_coef[c2:_cons])
    loca c2f=exp(_coef[c2:age]*`mean_age'+_coef[c2:female]+_coef[c2:_cons])
    loca diffc2=`c2f'-`c2m'
    di "c2[OR_female - OR_male]=>" %5.3g `c2f' " -" %5.3g `c2m' " =" %5.3g `diffc2'  // "OR" for odds ratio
    
    // response: c3
    loca c3m=exp(_coef[c3:age]*`mean_age'+_coef[c3:_cons])
    loca c3f=exp(_coef[c3:age]*`mean_age'+_coef[c3:female]+_coef[c3:_cons])
    loca diffc3=`cf'-`c3m'
    di "c3[OR_female - OR_male]=>" %5.3g `c3f' " -" %5.3g `c3m' " =" %5.3g `diffc3'  // "OR" for odds ratio
    
    接下来,我们应用扩展模型,该模型产生相同的固定效应估计,但随机效应的两个方差加上它们的协方差

    sort id item
    gen patt=_n
    expand 3                            // triple number of cases
    sort patt
    rename q response                   // just to match help file
    by patt, sort: gen alt=_n           // create all three potential answers
    gen chosen=response==alt            // mark the case with the chosen answer
    qui tab alt, gen(it)
    eq i2: it2
    eq i3: it3
    
    gllamm alt age female,i(id) nrf(2) eqs(i2 i3) nip(4) expanded(patt chosen m) /*
    */ link(mlogit) family(binomial) trace // compare the random effects to the "naive" model
    
    固定效应与上一个模型相同,但请注意,现在还有两个随机效应参数。上一个模型中的代码可用于计算女性的边际效应

    // fix age at mean
    su age, meanonly
    loca mean_age=r(mean)
    
    // c2
    loca c2m=exp(_coef[c2:age]*`mean_age' + _coef[c2:_cons])
    loca c2f=exp(_coef[c2:age]*`mean_age' + _coef[c2:female]+_coef[c2:_cons])
    loca diffc2=`c2f'-`c2m'
    di "c2[OR_female - OR_male]=>" %5.3g `c2f' " -" %5.3g `c2m' " =" %5.3g `diffc2'  // "OR"=>odds ratio
    
    // c3
    loca c3m=exp(_coef[c3:age]*`mean_age' + _coef[c3:_cons])
    loca c3f=exp(_coef[c3:age]*`mean_age' + _coef[c3:female]+_coef[c3:_cons])
    loca diffc3=`cf'-`c3m'
    di "c3[OR_female - OR_male]=>" %5.3g `c3f' " -" %5.3g `c3m' " =" %5.3g `diffc3'  // "OR"=>odds ratio
    

    希望我能做到这一点。如果犯了任何错误,请随时更正。

    您的模型是如何指定的,您是否使用了
    扩展的
    选项?如果有数据和代码,这将非常有用,因为
    gllamm
    不是最简单的程序。同时,即使是
    gllamm
    我认为您也可以se
    mat list e(b)
    手动提取系数并从中导出差异。由于它是多标称logit模型,您需要确定其他协变量的固定值。别忘了取指数!我没有使用(或知道?)
    gllamm
    的扩展选项,但我通过使用
    gsem
    构建与广义结构方程模型相同的模型,解决了我的问题。与
    gllamm
    不同,我可以使用
    margin,dydx(*)
    。代码更难看/更长,但结果是一样的(正如人们希望的那样!).感谢您对通过
    e(b)扩展和提取的建议
    ,我相信这会在未来派上用场的!
    gsem
    是一个很好的选择,尽管概念化和代码概率都比较繁琐。是否使用
    扩展的
    取决于如何指定随机效果。直觉上,我认为在mult中应该为每个响应使用单独的随机截取I级和多标称模型。以下示例。
    // fix age at mean
    su age, meanonly
    loca mean_age=r(mean)
    
    // c2
    loca c2m=exp(_coef[c2:age]*`mean_age' + _coef[c2:_cons])
    loca c2f=exp(_coef[c2:age]*`mean_age' + _coef[c2:female]+_coef[c2:_cons])
    loca diffc2=`c2f'-`c2m'
    di "c2[OR_female - OR_male]=>" %5.3g `c2f' " -" %5.3g `c2m' " =" %5.3g `diffc2'  // "OR"=>odds ratio
    
    // c3
    loca c3m=exp(_coef[c3:age]*`mean_age' + _coef[c3:_cons])
    loca c3f=exp(_coef[c3:age]*`mean_age' + _coef[c3:female]+_coef[c3:_cons])
    loca diffc3=`cf'-`c3m'
    di "c3[OR_female - OR_male]=>" %5.3g `c3f' " -" %5.3g `c3m' " =" %5.3g `diffc3'  // "OR"=>odds ratio