多项Logistic模型对mlogit的影响

时间:2015-06-16 19:00:11

标签: r mlogit

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

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

  1. 任何人都可以澄清为什么我的数据会产生这些NA吗?
  2. 任何人都可以帮我mlogit.effects使用下面的数据吗?
  3. 我会考虑将分析转移到multinom()。但是,我无法弄清楚如何格式化数据以适合使用multinom()的公式。我的数据是七个不同项目(可访问,信息,权衡,辩论,社交和响应)的一系列排名我是否只是模拟他们选择的第一个等级并忽略他们在其他等级中选择的内容?我可以得到这些信息。
  4. 可重现的代码如下:

    #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)
    

    这是我尝试设置一个类似于帮助文件中描述的数据框的数据框。它不起作用。我承认,虽然我很了解申请家庭,但对我来说,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)
    

2 个答案:

答案 0 :(得分:2)

我会尝试选项3并切换到multinom()。与参考项目(例如,下面的代码中的“辩论”)相比,该代码将模拟将项目排名为第1的对数概率。当K = 7项时,如果我们调用参考项目Item K ,那么我们正在建模

log [Pr(Item k 是1st)/ Pr(Item K 是1st)] =α k + x Ťβ<子>ķ

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

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

# 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

我没有做任何诊断,所以我没有声称这里使用的模型非常合适。

答案 1 :(得分:0)

您正在使用排名数据,而不仅仅是多项选择数据。 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