Эффекты от полиномиальной логистической модели в млогите
Я получил некоторую хорошую помощь в правильном форматировании моих данных для создания многочленной логистической модели с mlogit здесь ( Форматирование данных для mlogit)
Однако сейчас я пытаюсь проанализировать влияние ковариат в моей модели. Я нахожу файл справки в mlogit.effects()
быть не очень информативным. Одна из проблем заключается в том, что модель, по-видимому, производит много строк NA (см. Ниже, index(mod1)
).
- Кто-нибудь может уточнить, почему мои данные дают эти NA?
- Может ли кто-нибудь помочь мне получить
mlogit.effects
работать с данными ниже? - Я хотел бы рассмотреть смещение анализа на
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)
Вот моя попытка настроить фрейм данных, аналогичный тому, который изображен в файле справки. Это не работает. Признаюсь, хотя я довольно хорошо знаю семью, к которой я обращаюсь, это непристойно для меня.
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 ответа
Вы работаете с ранжированными данными, а не только с данными с многочленным выбором. Структура для ранжированных данных в mlogit состоит в том, что первым набором записей для человека являются все параметры, затем вторым - все параметры, кроме того, который занимает первое место и т. Д. Но индекс предполагает одинаковое количество вариантов каждый раз. Так что куча АН. Нам просто нужно избавиться от них.
> 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
Я попробую вариант 3 и переключусь на multinom()
, Этот код будет моделировать лог-шансы ранжирования элемента как 1-го по сравнению со ссылочным элементом (например, "Дебаты" в приведенном ниже коде). При K = 7 элементах, если мы вызываем контрольный элемент ItemK, то мы моделируем
log[ Pr(элементk 1-й) / Pr(элементK 1-й)] = αk + xTβk
для k = 1,...,K-1, где Itemk является одним из других (то есть не ссылочных) элементов. Выбор эталонного уровня повлияет на коэффициенты и их интерпретацию, но не повлияет на прогнозируемые вероятности. (Та же история для контрольных уровней для категориальных переменных предикторов.)
Я также упомяну, что здесь я обрабатываю пропущенные данные немного иначе, чем в исходном коде. Поскольку моей модели нужно только знать, какой элемент занимает первое место, мне нужно только выбросить записи, где эта информация отсутствует. (Например, в исходной записи № 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
Я не проводил никакой диагностики, поэтому я не утверждаю, что используемая здесь модель хорошо подходит.