警告:二项式glm的成功次数不是整数!(调查包)

66

我正在使用 twang 包创建倾向得分,这些得分用作二项式glm中的权重,使用 survey::svyglm 函数。代码大致如下:

pscore <- ps(ppci ~ var1+var2+.........., data=dt....)

dt$w <- get.weights(pscore, stop.method="es.mean")

design.ps <- svydesign(ids=~1, weights=~w, data=dt,)

glm1 <- svyglm(m30 ~ ppci, design=design.ps,family=binomial)

这会产生以下警告:

Warning message:
   In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!

有人知道我可能做错了什么吗?

我不确定这个问题是否应该在stats.SE上发布,但总的来说我想先在这里尝试一下。


m30变量的类型是什么? - James
权重必须是非整数的。二项式拟合试图找到离散数量试验中成功的概率。 - James
@james,权重是非整数 - 它们是倾向性分数的倒数概率 - 这就是“twang”+“survey”组合应该实现的内容... - Robert Long
4个回答

84

没有问题,glm只是在指定二项式(和泊松)模型时十分挑剔。如果它检测到试验数或成功次数不是整数,它会发出警告,但还是会拟合模型。如果你想要抑制警告(并且你确定这不是问题),可以使用family=quasibinomial


8
是的,尽管我看到了很多人因为收到这个警告而意识到自己在做一些愚蠢的事情。 - Ben Bolker
3
谢谢你的留言,@BenBolker。当然,我发问的原因就是我担心自己正在做些傻事。 - Robert Long
在这里还要注意的是,使用“quasibinomial”系列的模型一般会将“AIC”识别为“NA”。model$aic 会返回 NA。 - joel.wilson
2
@PaulBailey,估计的_回归系数_是相同的。它们的_标准误差_是不同的。 - Hong Ooi
1
如果您使用准二项分布(quasibinomial)而非二项式分布(binomial),则需要指定scale = 1。否则,您将无法得到相同的结果。此外,您无法使用quasibinomial family获得LogLikelihood或AIC。 - Regis
显示剩余2条评论

21
像@HoongOoi所说,带有二项分布(binomial)族的glm.fit期望整数计数,否则会发出警告;如果您想要非整数计数,请使用拟二项式(quasi-binomial)。我的回答其余部分将进行比较。
对于glm.fit中的R拟二项分布,与系数估计的二项分布完全相同(如@HongOoi在评论中提到的),但标准误差不同(如@nograpes的评论中提到的)。
源代码的比较 对stats :: binomial和stats :: quasibinomial源代码的diff显示以下更改:
文本“二项式分布”变为“拟二项式分布” aic函数返回NA而不是计算的AIC
以下内容被删除: 当权重= 0时,将结果设置为0 检查权重的整体性 simfun函数模拟数据
只有simfun可能会有所不同,但是glm.fit的源代码显示不使用该函数,与由stats :: binomial返回的对象中的其他字段(例如mu.eta和link)不同。
最小工作示例
在此最小工作示例中,使用quasibinomial或binomial得到的系数结果相同:
library('MASS')
library('stats')

gen_data <- function(n=100, p=3) {

  set.seed(1)  
  weights <- stats::rgamma(n=n, shape=rep(1, n), rate=rep(1, n))
  y <- stats::rbinom(n=n, size=1, prob=0.5)
  theta <- stats::rnorm(n=p, mean=0, sd=1)
  means <- colMeans(as.matrix(y) %*% theta)
  x <- MASS::mvrnorm(n=n, means, diag(1, p, p))

  return(list(x=x, y=y, weights=weights, theta=theta))  
}

fit_glm <- function(family) {
  data <- gen_data()
  fit <- stats::glm.fit(x = data$x,
                        y = data$y,
                        weights = data$weights,
                        family = family)
  return(fit)
}

fit1 <- fit_glm(family=stats::binomial(link = "logit"))
fit2 <- fit_glm(family=stats::quasibinomial(link = "logit"))

all(fit1$coefficients == fit2$coefficients)

与拟二项概率分布的比较

这篇文章表明,拟二项分布不同于具有额外参数phi的二项分布。但是在统计学和R中它们具有不同的含义。

首先,在quasibinomial的源代码中没有提到额外的phi参数。

其次,拟概率类似于概率,但并不是一个真正的概率值。在这种情况下,当数值为非整数时,无法计算(n k)的值,尽管可以使用Gamma函数。对于概率分布的定义可能会有问题,但对于估计来说是无关紧要的,因为(n k)这个项不依赖于参数并且从优化中排除。

对数似然估计器为:

log-likelihood estimator

带二项分布的对数似然估计器为:

log-likelihood with binomial family

其中常数与参数theta无关,因此它从优化中排除。

标准误差的比较

stats::summary.glm计算的标准误差对于binomialquasibinomial系列使用不同的离散度值,如stats::summary.glm所述:

GLM的离散度在拟合过程中没有使用,但需要用于找到标准误差。如果未提供dispersion或为NULL,则对于binomialPoisson系列,离散度被视为1,否则通过剩余自由度除以剩余卡方统计量(根据具有非零权重的案例计算)来估计离散度。

...

cov.unscaled:估计系数的未缩放(dispersion = 1)协方差矩阵。

cov.scaled:同上,但乘以dispersion

使用上述最小工作示例:

summary1 <- stats::summary.glm(fit1)
summary2 <- stats::summary.glm(fit2)

print("Equality of unscaled variance-covariance-matrix:")
all(summary1$cov.unscaled == summary2$cov.unscaled)

print("Equality of variance-covariance matrix scaled by `dispersion`:")
all(summary1$cov.scaled == summary2$cov.scaled)

print(summary1$coefficients)
print(summary2$coefficients)

展示相同的系数,相同未经缩放的方差协方差矩阵和不同经过缩放的方差协方差矩阵:
[1] "Equality of unscaled variance-covariance-matrix:"
[1] TRUE
[1] "Equality of variance-covariance matrix scaled by `dispersion`:"
[1] FALSE
       Estimate Std. Error   z value   Pr(>|z|)
[1,] -0.3726848  0.1959110 -1.902317 0.05712978
[2,]  0.5887384  0.2721666  2.163155 0.03052930
[3,]  0.3161643  0.2352180  1.344133 0.17890528
       Estimate Std. Error   t value   Pr(>|t|)
[1,] -0.3726848  0.1886017 -1.976042 0.05099072
[2,]  0.5887384  0.2620122  2.246988 0.02690735
[3,]  0.3161643  0.2264421  1.396226 0.16583365

1
系数的标准误差在准二项式和二项式家族中的计算方式不同。如果您查看stats::summary.glm函数,就可以看到这种差异。对于二项式家族(和泊松分布),离散度被硬编码为1。对于准二项式家族,离散度以“通常”的方式计算。这导致了不同的缩放协方差矩阵,从而导致了不同的标准误差。 - nograpes

8

计算上没有任何问题,但从统计学的角度来看,你可能在做一些不太合理的事情。在这种情况下,最好使用鲁棒回归方法,如果你的数据包括恰好为1或恰好为0的单位,则通常是比例响应数据的一个好选择。


1
“...也使用了不同的方法来适应数据”这是错误的。准二项式和二项式家族使用完全相同的数值方法,即IRLS与适当选择的mu和eta。区别在于准二项式1)抑制整数检查,2)不报告AIC,因为它在技术上不是基于最大似然的。 - Hong Ooi
2
你可以自己检查一下,准二项式分布并不比二项式分布更健壮,只需生成随机数据并使用这两个分布拟合模型即可。你会发现,无论数据如何或者类别是否线性可分,模型估计值都是完全相同的。 - Hong Ooi
谢谢您的指导,Hong Ooi!我之前在StackExchange的交叉验证(Cross-validation)话题中看到了另一个答案,似乎被误导了。这真是太有用了!看来,在这种情况下使用准伪二项分布并不是一个很好的方法。 - HaberdashPI

0

抱歉,但从更健壮的角度来看,如果底层机制是过分离散的二项模型,那么在估计标准误差时,过分离散的二项式将会加以考虑。因此,即使点估计相同,您也将获得更好的覆盖率。


glm.fit函数中,我看不出标准误差可能会有所不同(请参见我的答案)。也许survey在二项式家族中使用了simfun的附加功能。 - miguelmorin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接