我正在使用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上是否会更好,但总的来说我想我会先在这里尝试。
答案 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::binomial
和stats::quasibinomial
的源代码进行的比较显示了以下更改:
以及以下删除内容:
simfun
函数来模拟数据只有simfun
可以有所作为,但是glm.fit
的源代码未显示该功能的使用,与stats::binomial
返回的对象中的其他字段(例如{{1})不同}和mu.eta
。
在此最小工作示例中,对于这些系数,使用link
或quasibinomial
的结果是相同的:
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)项不依赖于参数且不属于最佳化。
对数似然估计器是:
与二项式家族有关的theta函数的对数似然是:
常量与参数theta无关,因此不符合优化要求。
stats::summary.glm中提到,phi
计算出的标准误差对stats::summary.glm
和binomial
系列使用不同的色散值:
在拟合过程中未使用GLM的离散度,但需要使用它来查找标准误差。如果未提供
quasibinomial
或dispersion
,则将NULL
和1
族的色散取为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时考虑到它。因此,即使点估计值相同,您也可以获得更好的覆盖率。