我正在估计一个多项式logit模型,并希望报告边际效应。我遇到了一个困难,因为当我使用更大版本的模型时,我得到一个错误。
这是一个可重复的例子。以下代码有两个协变量,可以正常工作。
library(mlogit)
df = data.frame(c(0,1,1,2,0,1,0), c(1,6,7,4,2,2,1), c(683,276,756,487,776,100,982))
colnames(df) <- c('y', 'col1', 'col3')
df$col2<-df$col1^2
mydata = df
mldata <- mlogit.data(mydata, choice="y", shape="wide")
mlogit.model1 <- mlogit(y ~ 1| col1+col2, data=mldata)
m <- mlogit(y ~ 1| col1+col2, data = mldata)
z <- with(mldata, data.frame(col1 = tapply(col1, index(m)$alt, mean),
col2 = tapply(col2, index(m)$alt, mean) ) )
effects(mlogit.model1, covariate = "col1", data = z)
现在,当我有三个协变量时:
mlogit.model1 <- mlogit(y ~ 1| col1+col2+col3, data=mldata)
m <- mlogit(y ~ 1| col1+col2+col3, data = mldata)
z <- with(mldata, data.frame(col1 = tapply(col1, index(m)$alt, mean),
col2 = tapply(col2, index(m)$alt, mean),
col3 = tapply(col3, index(m)$alt, mean) ) )
effects(mlogit.model1, covariate = "col1", data = z)
最后一行给出以下错误:
if中的错误(%c(1,3)中的rhs%){:参数长度为零
但如果我跑
effects(mlogit.model1, covariate = "col3", data = z)
然后它可以提供col3
的边际效果。为什么它不会给出col1
的边际效应?
请注意,所有列都不包含NULL
且长度相同。有人可以解释这种行为的原因是什么吗?
答案 0 :(得分:1)
我的感觉是,这可能有助于指导您找到解决方案。
参考:http://www.talkstats.com/showthread.php/44314-calculate-marginal-effects-using-mlogit-package
> methods(effects)
[1] effects.glm* effects.lm* effects.mlogit*
see '?methods' for accessing help and source code
Note: Non-visible functions are asterisked
说明:
在effects.mlogit的源代码中有一点变换是必需的。
在第16行,你应该替换“cov.list&lt; - lapply(attr(formula(object),”rhs“),as.character)”with“cov.list&lt; - strsplit(as.character(attr) (公式(对象),“rhs”)),“+”,fixed = TRUE)“
修复结果:
> effects(mlogit.model1, covariate = "col1", data = z)
0 1 2
-4.135459e-01 4.135459e-01 9.958986e-12
> myeffects(mlogit.model2, covariate = "col1", data = z2)
0 1 2
1.156729129 -1.157014778 0.000285649
require(mlogit)
myeffects<-function (object, covariate = NULL, type = c("aa", "ar", "rr",
"ra"), data = NULL, ...)
{
type <- match.arg(type)
if (is.null(data)) {
P <- predict(object, returnData = TRUE)
data <- attr(P, "data")
attr(P, "data") <- NULL
}
else P <- predict(object, data)
newdata <- data
J <- length(P)
alt.levels <- names(P)
pVar <- substr(type, 1, 1)
xVar <- substr(type, 2, 2)
cov.list <- strsplit(as.character(attr(formula(object), "rhs")), " + ", fixed = TRUE)
rhs <- sapply(cov.list, function(x) length(na.omit(match(x,
covariate))) > 0)
rhs <- (1:length(cov.list))[rhs]
eps <- 1e-05
if (rhs %in% c(1, 3)) {
if (rhs == 3) {
theCoef <- paste(alt.levels, covariate, sep = ":")
theCoef <- coef(object)[theCoef]
}
else theCoef <- coef(object)[covariate]
me <- c()
for (l in 1:J) {
newdata[l, covariate] <- data[l, covariate] + eps
newP <- predict(object, newdata)
me <- rbind(me, (newP - P)/eps)
newdata <- data
}
if (pVar == "r")
me <- t(t(me)/P)
if (xVar == "r")
me <- me * matrix(rep(data[[covariate]], J), J)
dimnames(me) <- list(alt.levels, alt.levels)
}
if (rhs == 2) {
newdata[, covariate] <- data[, covariate] + eps
newP <- predict(object, newdata)
me <- (newP - P)/eps
if (pVar == "r")
me <- me/P
if (xVar == "r")
me <- me * data[[covariate]]
names(me) <- alt.levels
}
me
}
df = data.frame(c(0,1,1,2,0,1,0), c(1,6,7,4,2,2,1), c(683,276,756,487,776,100,982))
colnames(df) <- c('y', 'col1', 'col3')
df$col2<-df$col1^2
mydata = df
mldata <- mlogit.data(mydata, choice="y", shape="wide")
mlogit.model1 <- mlogit(y ~ 1| col1+col2, data=mldata)
m <- mlogit(y ~ 1| col1+col2, data = mldata)
z <- with(mldata, data.frame(col1 = tapply(col1, index(m)$alt, mean),
col2 = tapply(col2, index(m)$alt, mean) ) )
mldata2 <- mlogit.data(mydata, choice="y", shape="wide")
mlogit.model2 <- mlogit(y ~ 1| col1+col2+col3, data=mldata2)
m2 <- mlogit(y ~ 1| col1+col2+col3, data = mldata2)
z2 <- with(mldata, data.frame(col1 = tapply(col1, index(m2)$alt, mean),
col2 = tapply(col2, index(m2)$alt, mean),
col3 = tapply(col3, index(m2)$alt, mean) ) )
effects(mlogit.model1, covariate = "col1", data = z)
myeffects(mlogit.model2, covariate = "col1", data = z2)