警告:二项式glm中的非整数#successes! (调查包)

时间:2012-10-18 10:57:41

标签: r glm

我正在使用twang包来创建倾向得分,这些得分用作survey::svyglm的二项式glm中的权重。代码看起来像这样:

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上是否会更好,但总的来说我想我会先在这里尝试。

4 个答案:

答案 0 :(得分:47)

没有错,glm在指定二项式(和泊松)模型时只是挑剔。如果检测到没有,它会发出警告。试验或成功是不完整的,但它仍然适用于模型。如果您想要取消警告(并且您确定这不是问题),请改用family=quasibinomial

答案 1 :(得分:6)

没有错,计算,但统计你可能没有做一些有意义的事情。在这种情况下,最好使用稳健的回归方法,如果您的数据包含精确为1或精确为0的单位,这通常是比例响应数据的好主意。

答案 2 :(得分:2)

就像@HoongOoi所说,glm.fit族的binomial期望整数计数,否则会发出警告。如果需要非整数计数,请使用quasi-binomial。我的其余答案将这些进行比较。

glm.fit在R中的拟二项式与binomial完全相同,用于系数估计(如@HongOoi的评论中所述),但不包括标准误差(如IF的评论中所述) @nograpes)。

源代码比较

stats::binomialstats::quasibinomial的源代码进行的比较显示了以下更改:

  • 文本“二项式”变为“准二项式”
  • aic函数返回NA而不是计算出的AIC

以及以下删除内容:

  • 当权重= 0时将结果设置为0
  • 检查权重的完整性
  • simfun函数来模拟数据

只有simfun可以有所作为,但是glm.fit的源代码未显示该功能的使用,与stats::binomial返回的对象中的其他字段(例如{{1})不同}和mu.eta

最小的工作示例

在此最小工作示例中,对于这些系数,使用linkquasibinomial的结果是相同的:

binomial

与准二项式概率分布的比较

This thread表示准二项式分布与具有附加参数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参数。

第二,quasiprobability类似于概率,但不是适当的概率。在这种情况下,尽管数字不是整数,但无法计算项(n \ k),尽管可以使用Gamma函数。对于概率分布的定义,这可能是个问题,但与估计无关,因为(n选择k)项不依赖于参数且不属于最佳化。

对数似然估计器是:

log-likelihood estimator

与二项式家族有关的theta函数的对数似然是:

log-likelihood with binomial family

常量与参数theta无关,因此不符合优化要求。

标准误比较

stats::summary.glm中提到,phi计算出的标准误差对stats::summary.glmbinomial系列使用不同的色散值:

  

在拟合过程中未使用GLM的离散度,但需要使用它来查找标准误差。如果未提供quasibinomialdispersion,则将NULL1族的色散取为binomial,否则由剩余的Chisquared统计量估算(由非零权重的案例计算得出)除以剩余的自由度。

     

...

     

Poisson:估计系数的未缩放(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)

答案 3 :(得分:0)

很抱歉,但从某种意义上说,如果基础机制是过度分散的二项式模型,那么过度分散的二项式将在估算标准erorr时考虑到它。因此,即使点估计值相同,您也可以获得更好的覆盖率。