像@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)这个项不依赖于参数并且从优化中排除。
对数似然估计器为:
带二项分布的对数似然估计器为:
其中常数与参数theta无关,因此它从优化中排除。
标准误差的比较
stats::summary.glm
计算的标准误差对于binomial
和quasibinomial
系列使用不同的离散度值,如stats::summary.glm所述:
GLM的离散度在拟合过程中没有使用,但需要用于找到标准误差。如果未提供dispersion
或为NULL
,则对于binomial
和Poisson
系列,离散度被视为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
m30
变量的类型是什么? - James