pglm 的比例与二进制响应

Proportion vs. binary response with pglm

我正在处理面板数据,其中包含几年对学校的观察。我的 DV 是考试及格者的比例,但不是正态分布的,许多 DV 的观察结果 > 0.8。因此,使用 plm()(来自包 plm)的面板线性模型是不合适的,因此我尝试使用 pglm()(来自包 pglmtreat the DV as a binary response and use logistic regression。我统计了应试者和通过者的人数。

我确定我需要对这些数据使用固定效应(单位内)估计,因为我对学校内考试通过率的平均变化感兴趣。我对 post 完整数据集的观察太多了,但这里是错误消息的一个小的可重现示例:

id <- c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4)
year <- rep(c(2017, 2018, 2019), 4)
proportion <- c(.67, .77, .79, .88, .89, .85, .79, .81, .79, .87, .75, .74)
X1 <- c(.05, .041, .037, .015, .012, .021, .081, .055, .062, .034, .031, .022)
X2 <- c(145, 146, 145, 155, 154, 154, 150, 152, 156, 148, 150, 151)
takers <- c(50, 62, 55, 112, 101, 119, 44, 45, 48, 66, 69, 60)
passers <- c(34, 48, 43, 99, 90, 101, 35, 36, 38, 57, 52, 44)
fails <- takers - passers

data <- as.data.frame(cbind(id, year, proportion, X1, X2, takers, passers, fails))

pglm::pglm(cbind(passers, fails) ~ X1 + X2, index = c("id", "year"), model = "within",  family = binomial(link = "logit"), data = data)
#> Error in `.rowNamesDF<-`(x, value = value): duplicate 'row.names' are not allowed

reprex package (v0.3.0)

于 2020-10-21 创建

我没有遇到问题运行进行常规登录:

glm(cbind(passers, fails) ~ X1 + X2,family = binomial(link = "logit"), data = data)

而且我也熟悉 treat-DV-as-binary 方法的替代方法,即使用 beta 回归的 betareg() 包]2,但我不明白为什么要使用betareg() 的固定效果。我也可以 运行 使用 glmer() 并设置随机截距 (1|id) 的代码,但考虑到我的研究问题,随机效应方法在理论上没有意义,而且 Hausman 检验表明我无论如何都需要固定效应。

我对错误消息的解释是行名以某种方式重复;我通过将所有行名称设置为 NULL 来确保不是这种情况,但这并没有解决问题:

row.names(data) <- NULL

我在这个问题上也提到了看似相似的问题such as this,但我已确保 id-year 配对中没有重复。

因此,如果您能帮助我们找出错误原因,我们将不胜感激。当然,也欢迎对方法论发表评论。

有关重复行名的错误消息有点误导,因为 pglm 无法处理特定输入 glm 可以使用指定比例的 two-column 矩阵处理(cbind(passers, fails) 在你的代码中)。 glm 对于各种输入可能性更灵活,请参阅 ?glm

pglm 只能处理二元因变量作为公式 left-hand 侧的输入。因此,您想将数据降低到“个人级别”(这里是使用 glm http://www.simonqueenborough.info/R/statistics/lessons/Binomial_Data.html; http://pages.stat.wisc.edu/~mchung/teaching/MIA/reading/GLM.logistic.Rpackage.pdf 对主题的一些更好的讨论,包括个人结果(二元响应)和组结果(比例)。

这里有一些代码可以为您提供数据转换,以复制您使用 glmpglm 估计的模型。查看考试总数 takerspassersfails)如何用于从组级别( prop部分)。

# glm - your reference
summary(mod1 <- glm(cbind(passers, fails) ~ X1 + X2, family = binomial(link = "logit"), data = data))
# glm - same with weights
data$prop <- data$passers / data$takers
summary(mod2 <- glm(prop ~ X1 + X2, family = binomial(link = "logit"), data = data, weights = takers))

# construct data suitable for pglm
df2 <- df[rep(seq_along(data$takers), data$takers), ]
df2$ID <- paste(df2$id, unlist(lapply(df$takers, seq_len)), sep = '')
vec <- numeric()
for (i in 1:nrow(data)) {
    vec  <- c(vec, (c(rep(1, data$passers[i]), rep(0, data$fails[i]))))
}
df2$resp <- vec  
pdf2 <- pdata.frame(df2, index = "id")

# same with pglm
summary(mod3 <- pglm(resp ~ X1 + X2, family = binomial(link = "logit"), data = pdf2, model = "pooling"))

如果您要估计 "pooling" 模型以外的任何其他模型,您将需要构建一个不同的索引(否则您会得到错误的结果,我假设)——您可能没有信息(pdf2/df2 中所有行的 individual-time 组合)。