【问题标题】:Effects from multinomial logistic model in mlogitmlogit 中多项逻辑模型的影响
【发布时间】:2015-09-01 18:26:48
【问题描述】:

我收到了一些很好的帮助,让我的数据正确格式化,在这里使用 mlogit 生成多项逻辑模型 (Formatting data for mlogit)

但是,我现在正在尝试分析协变量在我的模型中的影响。我发现mlogit.effects() 中的帮助文件信息量不大。问题之一是该模型似乎产生了很多行 NA(见下文,index(mod1))。

  1. 谁能澄清为什么我的数据会产生这些 NA?
  2. 谁能帮我获得mlogit.effects 来处理以下数据?
  3. 我会考虑将分析转移到multinom()。但是,我不知道如何格式化数据以适合使用multinom() 的公式。我的数据是七个不同项目(可访问性、信息、权衡、辩论、社交和响应)的一系列排名我可以得到那个信息。

可复现的代码如下:

#Loadpackages 
library(RCurl)
library(mlogit)
library(tidyr)
library(dplyr)
#URL where data is stored
dat.url <- 'https://raw.githubusercontent.com/sjkiss/Survey/master/mlogit.out.csv'

#Get data
dat <- read.csv(dat.url)

#Complete cases only as it seems mlogit cannot handle missing values or tied data which in this case you might get because of median imputation
dat <- dat[complete.cases(dat),]

#Change the choice index variable (X) to have no interruptions, as a result of removing some incomplete cases
dat$X <- seq(1,nrow(dat),1)

#Tidy data to get it into long format
dat.out <- dat %>%
  gather(Open, Rank, -c(1,9:12)) %>%
  arrange(X, Open, Rank)

#Create mlogit object
mlogit.out <- mlogit.data(dat.out, shape='long',alt.var='Open',choice='Rank', ranked=TRUE,chid.var='X')

#Fit Model
mod1 <- mlogit(Rank~1|gender+age+economic+Job,data=mlogit.out)

这是我尝试设置一个类似于帮助文件中描述的数据框。它不起作用。我承认,虽然我非常了解 apply 家族,但 tapply 对我来说是模糊的。

with(mlogit.out, data.frame(economic=tapply(economic, index(mod1)$alt, mean)))

从帮助中比较:

data("Fishing", package = "mlogit")
Fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode")
m <- mlogit(mode ~ price | income | catch, data = Fish)

# compute a data.frame containing the mean value of the covariates in
# the sample data in the help file for effects
z <- with(Fish, data.frame(price = tapply(price, index(m)$alt, mean),
                       catch = tapply(catch, index(m)$alt, mean),
                       income = mean(income)))

# compute the marginal effects (the second one is an elasticity
effects(m, covariate = "income", data = z)

【问题讨论】:

  • 当我将您的代码运行到mod1 &lt;- mlogit(... 时,它工作正常。当我查看summary(mod1) 时,它看起来不错。查看?index,帮助页面指向mlogit.data,这听起来像是用于数据,而不是模型,描述是:“以合适的形式塑造一个data.frame以供使用mlogit 函数。”我也没有看到帮助中的模型上使用了index。也许你需要更新你的mlogit 包?
  • ...虽然看起来mlogit 自 2013 年 12 月以来没有更新,所以这可能不是你的问题。我在命名空间中找到的唯一 index 对象来自 zoo 包。那么,如果您不在模型上使用index(改用summary()),您还有疑问吗?
  • Gregor,帮助示例中的这一行在模型上使用了 index() 命令:z
  • 但这并没有改变我无法让 effects() 在 mlogit 模型上工作的事实。
  • 但是在帮助示例中Fish 是一个数据框,而不是一个模型!

标签: r mlogit


【解决方案1】:

我将尝试选项 3 并切换到 multinom()。与参考项目(例如,下面代码中的“辩论”)相比,此代码将模拟将项目排名为第一的对数几率。对于 K = 7 个项目,如果我们将参考项目称为 ItemK,那么我们就是在建模

    log[ Pr(Itemk is 1st) / Pr(ItemK is 1st) ] = αk + x Tβk

对于 k = 1,...,K-1,其中 Itemk 是其他(即非参考)项目之一。参考水平的选择会影响系数及其解释,但不会影响预测概率。 (分类预测变量的参考水平也是如此。)

我还要提一下,我在此处处理丢失数据的方式与在您的原始代码中有所不同。由于我的模型只需要知道哪个项目排名第一,因此我只需要丢弃缺少该信息的记录。 (例如,在原始数据集中,第 43 条记录的“信息”排名第一,因此即使其他 3 项不适用,我们也可以使用该记录。)

# Get data
dat.url <- 'https://raw.githubusercontent.com/sjkiss/Survey/master/mlogit.out.csv'
dat <- read.csv(dat.url)

# dataframe showing which item is ranked #1
ranks <- (dat[,2:8] == 1)

# for each combination of predictor variable values, count
# how many times each item was ranked #1
dat2 <- aggregate(ranks, by=dat[,9:12], sum, na.rm=TRUE)

# remove cases that didn't rank anything as #1 (due to NAs in original data)
dat3 <- dat2[rowSums(dat2[,5:11])>0,]

# (optional) set the reference levels for the categorical predictors
dat3$gender <- relevel(dat3$gender, ref="Female")
dat3$Job <- relevel(dat3$Job, ref="Government backbencher")

# response matrix in format needed for multinom()
response <- as.matrix(dat3[,5:11])

# (optional) set the reference level for the response by changing
# the column order
ref <- "Debate"
ref.index <- match(ref, colnames(response))
response <- response[,c(ref.index,(1:ncol(response))[-ref.index])]

# fit model (note that age & economic are continuous, while gender &
# Job are categorical)
library(nnet)
fit1 <- multinom(response ~ economic + gender + age + Job, data=dat3)

# print some results
summary(fit1)
coef(fit1)
cbind(dat3[,1:4], round(fitted(fit1),3)) # predicted probabilities

我没有做任何诊断,所以我没有声称这里使用的模型提供了很好的拟合。

【讨论】:

  • 好的,谢谢@dagremu。这似乎是最好的方法。我曾希望找到一种方法来使用排名靠后的信息,但这样就可以了!
  • 我同意浪费所有其他排名没有吸引力。想到的另一种方法是对每个等级重复上述过程。也就是说,您已经对排名第 1 项的对数几率进行了建模。然后,您将分别对排名第 2 项的对数几率进行建模,依此类推。我想你只需要编辑上面的第三行代码,设置ranks,将右边的1更改为2,然后3,等等。显然,对所有这些东西建模并不理想分开,因为模型之间共享信息。是否值得取决于您的科学问题是什么。
【解决方案2】:

您正在使用排名数据,而不仅仅是多项选择数据。 mlogit 中排名数据的结构是一个人的第一组记录都是选项,然后第二组是除排名第一的选项之外的所有选项,依此类推。但该指数假设每次的期权数量相同。所以一堆NA。我们只需要摆脱它们。

> with(mlogit.out, data.frame(economic=tapply(economic, index(mod1)$alt[complete.cases(index(mod1)$alt)], mean)))
            economic
Accessible      5.13
Debate          4.97
Information     5.08
Officials       4.92
Responsive      5.09
Social          4.91
Trade.Offs      4.91

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2019-12-20
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多