在R中运行嵌套Logit回归

3
我想在R中运行嵌套的逻辑回归,但我在网上找到的示例并没有帮助太多。我阅读了来自此网站(Step by step procedure on how to run nested logistic regression in R)的一个示例,它与我的问题类似,但我发现最终好像没有解决(问者报告了错误,我没有看到更多答案)。
所以我有9个预测变量(连续分数)和1个分类相关变量(DV)。 DV称为“effect”,它可以分为两个一般类别:“negative(0)”和“positive(1)”。我知道如何运行一个简单的二进制logit回归(使用一般的分组方式,即负面(0)和积极(1)),但这还不够。 “positive”可以进一步分为两种类型:“physical(1)”和“mental(2)”。因此,我想运行一个包括这3个类别(负面(0)、身体(1)和心理(2))的嵌套模型,并反映出“身体”和“心理”嵌套在“积极”中的特性。也许R可以将这两个模型(通用vs.详细信息)进行比较?因此,我创建了两个新列,一个称为“effect general”,其中个人得分为“negative(0)”和“positive(1)”;另一个称为“effect detailed”,其中包含3个值-负面(0)、身体(1)和心理(2)。我只使用“效应一般”运行了一个简单的二进制logit回归,但我不知道如何为“详细效应”运行嵌套的logit模型。
从我搜索到的示例和其他材料中可以看出,R包“mlogit”似乎是正确的选择,但我被如何使它适用于我的数据所困扰。我不太理解R-help中的示例,以及我之前提到的网站上的示例中的这一部分(...shape ='long',alt.var='town.list',nests=list(town.list)...)让我非常困惑:我能看到我的数据形状应该是“wide”,但我不知道“alt.var”和“nests”是什么。
我还查看了mlogit手册的第19页,其中有嵌套logit模型调用的示例。但就选项而言,我仍然不能决定我需要什么。(http://cran.r-project.org/web/packages/mlogit/mlogit.pdf
有人能为我提供详细的步骤和备注吗?我相信这个示例(如果经过充分讨论和解决)也将对我和其他人有很大帮助!
感谢您的帮助!

我认为你对嵌套模型的理解存在混淆。它们不涵盖“积极”情况下内部有两个水平的DV。你有一个多项结果。 - IRTFM
看起来你可能有三种结果。接下来,您需要决定结果是否有序。换句话说,精神结果是否比身体结果更(或更少)严重。如果结果没有顺序,只需要不同,那么这将使事情变得更简单。如果到明天没有其他人提供代码,我可以挖掘出任一情况的代码。 - Mark Miller
由于MNL具有IIA属性,因此在以下情况下可能无法很好地工作:1)当替代方案不独立时。即存在一些替代方案比其他替代方案更相似的组别时,例如公共交通方式与私人车辆之间的比较。 - Ferrari
当个体之间存在口味差异时,即个体的感知随其社会经济地位而变化。在这种情况下,我们需要随机系数模型而不是均值模型,例如当存在一些更相似的替代品组时,如公共交通工具与私人车辆之间的组别。 - Ferrari
嗨DWin,我以为我也混淆了嵌套模型和多项式模型,但是从我找到的材料中,这两个模型都可以应用于我的数据,而嵌套逻辑模型会更好。有人建议我可以尝试“广义线性混合模型”,但是R中的例子似乎是另一回事。它们的“嵌套性”存在于自变量(预测因子)中,而不是结果中。请参见我在“lme4”软件包中找到的以下R代码: - Ferrari
显示剩余2条评论
1个回答

0

我可以帮助你理解 mlogit 结构。当使用 mlogit.data() 命令时,需要指定 choice=yourchoicevariable(如果你有面板数据集,即从同一人获得多个回应,则需要指定 id.var = respondentid),以及 shape="wide" 参数。新创建的 data.frame 将呈现长格式,每个选择情况(negative, physical, mental)占据一行。因此,你将有 3 行,而在宽数据格式中只有 1 行。无论你的 MN 选择变量是什么,它现在都将成为逻辑值的一列,对于受访者所选择的行,值为 TRUE 。行名称现在将采用以下格式:observation#.level(choice variable)。因此,在你的数据集的第一行中,如果个人回答为 negative,则会看到:

row.name   | choice
1.negative | TRUE
1.physical | FALSE
1.mental   | FALSE

请注意,每个选择的实际因子水平存储在称为mlogit.data.frame的索引中,您可以通过index(your.data.frame)查看观察编号(即来自宽格式数据框的行号)存储在chid中。这本质上是行名称告诉您的内容,即chid.alt。还要注意,如果您的数据处于宽格式中,则无需指定alt.var,只需在长格式中指定即可。正如我刚才所描述的那样,mlogit.data函数会为您执行此操作。基本上,当您指定选择变量并创建alt.var时,它会采用unique(choice),因此如果您的数据处于宽格式中,则它是冗余的。
然后,您可以通过向mlogit()命令添加嵌套的命名列表来指定嵌套,例如假设您的因子水平只是'0'、'1'、'2':
mlogit(..., nests = c(negative = c('0'), positive = c('1','2'))
或者如果因子级别是'negative'、'physical'、'mental',则应该像这样:

mlogit(..., nests = c(negative = c('消极'), positive = c('身体','心理'))

还要注意,根据软件包文档,一个嵌套必须仍然使用c()参数进行指定。如果您指定了un.nest.el=T参数,则生成的模型将具有嵌套之间的iv估计值;如果un.nest.el=F,则具有特定于嵌套的估计值。您可能会发现肯尼斯·特雷恩的示例有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接