就像@HoongOoi 所说,glm.fit
家庭binomial
期望整数计数,否则会发出警告;如果您想要非整数计数,请使用quasi-binomial
. 我的其余答案比较了这些。
R for 中的准二项式与系数估计glm.fit
完全相同binomial
(如@HongOoi 的评论中所述),但与标准误差不同(如@nograpes 的评论中所述)。
源码对比
源代码的差异stats::binomial
并stats::quasibinomial
显示以下更改:
- 文本“二项式”变为“准二项式”
- aic 函数返回 NA 而不是计算的 AIC
以及以下删除:
- 当权重 = 0 时将结果设置为 0
- 检查权重的完整性
simfun
模拟数据的功能
onlysimfun
可以有所作为,但是 的源代码glm.fit
显示没有使用该函数,这与返回的对象中的其他字段不同,stats::binomial
例如mu.eta
and link
。
最小的工作示例
对于这个最小工作示例中的系数,使用quasibinomial
or的结果是相同的: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 \choose k),尽管可以使用 Gamma 函数。这对于概率分布的定义可能是一个问题,但与估计无关,因为项 (n 选择 k) 不依赖于参数并且不属于优化。
对数似然估计是:
作为二项式族的 theta 函数的对数似然是:
其中常数与参数 theta 无关,因此它不在优化范围内。
标准误比较
如stats::summary.glm中所述,通过对和系列stats::summary.glm
使用不同的离散值计算的标准误差:binomial
quasibinomial
拟合过程中不使用 GLM 的离散度,但需要找到标准误差。如果dispersion
未提供 或NULL
,则将离散视为和族,否则通过残差卡方统计量(根据非零权重的情况计算)除以残差自由度来估计1
。binomial
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)
显示相同的系数、相同的未缩放方差-协方差矩阵和不同的缩放方差-协方差矩阵:
[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