已知试验次数(和分离?)的比例数据:GLM 还是 beta 回归?

机器算法验证 r 广义线性模型 二项分布 贝塔回归 分离
2022-04-11 18:41:39

我进行了很多生物测定,在这些生物测定中,我不是对个体进行死亡率评分,而是对个体群体的死亡率进行评分(分母,即试验次数是已知的):

样本数据:

library(tidyverse)
library(betareg)
dataset <- data.frame(treatment = rep(c("a", "b", "c", "d"), each = 5),
                      success = c(6,6,9,6,5,10,10,9,10,10,6,8,9,9,10,7,8,6,8,7),
                      fail = c(4,3,1,4,5,0,0,0,0,0,4,2,1,1,0,3,2,4,2,3)) %>%
  mutate(n = success+fail,
         treatment = factor(treatment, levels = c("a", "b", "c", "d")))

通常,我会将其作为具有准二项式家族的 GLM 运行,但在某些情况下(如提供的情况),我遇到一种情况,即一次处理中的所有复制为 0% 或 100%。在这种情况下标准。对于该处理,误差和 CI 估计值非常大。我认为这与完全分离类似(或相同),尽管我只见过在由 0 和 1 组成的二项式响应数据中讨论过完全分离。

常规 GLM:

data.list <- list(success.fail = cbind(dataset$success, dataset$fail), treatment = dataset$treatment)
binary.glm <- glm(success.fail ~ treatment, data = data.list, family = quasibinomial)
summary(binary.glm)

> summary(binary.glm)

Call:
glm(formula = success.fail ~ treatment, family = quasibinomial, 
    data = data.list)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.81457  -0.33811   0.00012   0.54942   1.86737  

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)    0.6325     0.2622   2.412   0.0282 *
treatmentb    20.4676  2890.5027   0.007   0.9944  
treatmentc     1.0257     0.4271   2.402   0.0288 *
treatmentd     0.3119     0.3801   0.821   0.4239  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for quasibinomial family taken to be 0.7634611)

    Null deviance: 43.36  on 19  degrees of freedom
Residual deviance: 13.40  on 16  degrees of freedom
AIC: NA

Number of Fisher Scoring iterations: 18

我在这篇文章中读过关于处理分离的内容,但我没有办法将 Firth 的惩罚可能性与我的比例数据一起使用。相反,我转向了 beta 回归作为一种选择。在 betareg() 的 weights 参数中使用我的每个比例的 n 值(观察次数)作为加权值是否合理?我使用 Smithson & Verkuilen 的等式 (4) 将我的比例转换为适合 (0,1) 区间,“ A Better Lemon Squeezer?Maximum-Likelihood Regression With Beta-Distributed Dependent Variables ”(直接链接到PDF)。

贝塔回归:

lemonsqueeze.fun <- function(df, success, fail) {
  new <- df %>%
    mutate(prop.naught = {{success}}/({{success}}+{{fail}}),
           n = {{success}}+{{fail}},
           y.prime = (prop.naught-0)/(1-0),
           y.doubleprime = ((y.prime*(length(y.prime)-1))+0.5)/length(y.prime))
  return(new)
}

transformed.data <- lemonsqueeze.fun(dataset, success, fail)
beta.mod <- betareg(y.doubleprime ~ treatment, data = transformed.data, weights = n)
summary(beta.mod)

> summary(beta.mod)

Call:
betareg(formula = y.doubleprime ~ treatment, data = transformed.data, weights = n)

Standardized weighted residuals 2:
    Min      1Q  Median      3Q     Max 
-6.8894 -1.9274  0.0000  0.5899  8.4217 

Coefficients (mean model with logit link):
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.63875    0.07291   8.761   <2e-16 ***
treatmentb   2.30484    0.14846  15.525   <2e-16 ***
treatmentc   1.04830    0.11600   9.037   <2e-16 ***
treatmentd   0.21245    0.10408   2.041   0.0412 *  

Phi coefficients (precision model with identity link):
      Estimate Std. Error z value Pr(>|z|)    
(phi)   15.765      1.602   9.841   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Type of estimator: ML (maximum likelihood)
Log-likelihood: 229.5 on 5 Df
Pseudo R-squared: 0.7562
Number of iterations: 21 (BFGS) + 2 (Fisher scoring) 

在所有情况下,标准。误差要小得多,我们不再对治疗 b 进行疯狂的估计。这有问题吗?我应该检查的假设?给这只猫剥皮的更好方法?唉,我不是统计学家,只是一个统计学知识不足以构成危险的生物学家。

3个回答

您拥有的数据实际上是经典的二项式设置,您可以使用二项式 GLM 对数据进行建模,或者使用标准最大似然 (ML) 估计器或使用减少偏差 (BR) 估计器(Firth 的惩罚估计器)。我不会在这里使用 beta 回归。

对于治疗b,您有 49 次成功和 0 次失败。

subset(dataset, treatment == "b")
##    treatment success fail  n
## 6          b      10    0 10
## 7          b      10    0 10
## 8          b       9    0  9
## 9          b      10    0 10
## 10         b      10    0 10

因此,存在导致无限 ML 估计器的准完全分离,而 BR 估计器保证是有限的。请注意,BR 估计器为分离提供了一个原则性的解决方案,而对比例数据的修剪是相当临时的。

要使用 ML 和 BR 拟合二项式 GLM,您可以使用该glm()函数并将其与brglm2包(Kosmidis & Firth, 2020, Biometrika, doi:10.1093/biomet/asaa052)结合使用。指定二项式响应的更简单方法是使用矩阵,其中第一列包含成功,第二列包含失败:

ml <- glm(cbind(success, fail) ~ treatment, data = dataset, family = binomial)
summary(ml)
## Call:
## glm(formula = cbind(success, fail) ~ treatment, family = binomial, 
##     data = dataset)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -1.81457  -0.33811   0.00012   0.54942   1.86737  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)  
## (Intercept)    0.6325     0.3001   2.108   0.0351 *
## treatmentb    20.4676  3308.1100   0.006   0.9951  
## treatmentc     1.0257     0.4888   2.099   0.0359 *
## treatmentd     0.3119     0.4351   0.717   0.4734  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 43.36  on 19  degrees of freedom
## Residual deviance: 13.40  on 16  degrees of freedom
## AIC: 56.022
## 
## Number of Fisher Scoring iterations: 18

可以通过使用"brglmFit"方法(提供于brglm2)而不是默认"glm.fit"方法来获得对应的 BR 估计量:

library("brglm2")
br <- glm(cbind(success, fail) ~ treatment, data = dataset, family = binomial,
  method = "brglmFit")
summary(br)
## Call:
## glm(formula = cbind(success, fail) ~ treatment, family = binomial, 
##     data = dataset, method = "brglmFit")
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.7498  -0.2890   0.4368   0.6030   1.9096  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept)   0.6190     0.2995   2.067  0.03875 * 
## treatmentb    3.9761     1.4667   2.711  0.00671 **
## treatmentc    0.9904     0.4834   2.049  0.04049 * 
## treatmentd    0.3041     0.4336   0.701  0.48304   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 43.362  on 19  degrees of freedom
## Residual deviance: 14.407  on 16  degrees of freedom
## AIC:  57.029
## 
## Type of estimator: AS_mixed (mixed bias-reducing adjusted score equations)
## Number of Fisher Scoring iterations: 1

请注意,非分离处理的系数估计值、标准误差和 t 统计量仅发生非常轻微的变化。主要区别在于治疗的有限估计b

因为 BR 调整非常轻微,您仍然可以使用通常的推断(Wald、似然比等)和信息标准等。在 R 中,brglm2这特别容易,因为br上面拟合的模型仍然继承自glm. 作为说明,我们可以评估该treatment因素的总体重要性:

br0 <- update(br, . ~ 1)
AIC(br0, br)
##     df      AIC
## br0  1 79.98449
## br   4 57.02927
library("lmtest")
lrtest(br0, br)
## Likelihood ratio test
## 
## Model 1: cbind(success, fail) ~ 1
## Model 2: cbind(success, fail) ~ treatment
##   #Df  LogLik Df  Chisq Pr(>Chisq)    
## 1   1 -38.992                         
## 2   4 -24.515  3 28.955  2.288e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

或者我们可以查看四种处理的所有成对对比(又名 Tukey 对比):

library("multomp")
summary(glht(br, linfct = mcp(treatment = "Tukey")))
##   Simultaneous Tests for General Linear Hypotheses
## 
## Multiple Comparisons of Means: Tukey Contrasts
## 
## Fit: glm(formula = cbind(success, fail) ~ treatment, family = ## binomial, 
##     data = dataset, method = "brglmFit")
## 
## Linear Hypotheses:
##            Estimate Std. Error z value Pr(>|z|)  
## b - a == 0   3.9761     1.4667   2.711   0.0286 *
## c - a == 0   0.9904     0.4834   2.049   0.1513  
## d - a == 0   0.3041     0.4336   0.701   0.8864  
## c - b == 0  -2.9857     1.4851  -2.010   0.1641  
## d - b == 0  -3.6720     1.4696  -2.499   0.0517 .
## d - c == 0  -0.6863     0.4922  -1.394   0.4743  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)

最后,对于标准 ML 估计器,您也可以quasibinomial像在您的帖子中那样使用该族,尽管在此数据集中您没有过度离散(而是有点分散不足)。但是,该brglm2软件包目前不支持此功能。但鉴于没有证据表明过度分散,我不会在这里担心这一点。

Beta 回归本身并不能解决问题。就是你用一行代码调整了数据:

y.doubleprime = ((y.prime*(length(y.prime)-1))+0.5)/length(y.prime))

这样 beta 回归软件就不必处理它(如逻辑回归)无法直接处理的确切 0 或 1 比例。包装上的小插图betareg说这是“在实践中有用的转变......n样本量在哪里”。我不确定是否n应该像您似乎(我不流利tidyverse)那样对每组观察结果进行调整,或者是否应该基于整组观察结果进行调整。大概您遵循了您链接的论文的建议。

这个线程中,包作者之一描述了betareg()函数中权重的正确使用:“确保你的权重被缩放,使得sum(weights)与独立观察的数量相对应。” 这似乎是你所做的。

当你“不是对个体的死亡率进行评分,而是对个体群体的死亡率进行评分(分母,即试验次数是已知的)”,有一个替代方案可以允许 Firth 惩罚。只需将您的数据放入更长的形式中,每个活动/死 (0/1) 观察一行。

例如,您可以将第一批treatment a观察结果扩展为 6 行,结果为 0 和 4 行,结果为 1。然后结果将是logistf所期望的一组 0/1 值。如果您想跟踪涉及哪一批处理(您的示例建议 4 个处理中的每一个处理 5 个单独的批次),您也可以在每一行中对其进行注释。

为响应另一个答案而添加:

我不知道另一个答案中推荐的brglm2软件包,并同意这可能是最简单和最合适的方法。但是,请确保您了解您使用的惩罚的性质。例如,原始的 Firth 方法同时惩罚截距和回归系数因此,即使您获得了更好的系数估计,这种模型的概率估计也可能存在偏差。中现在提供了修改后的方法。logistfbrglm2

Achim 已经给出了一个很好的答案,指出这对于 beta 回归来说确实不是一个好的场景,因为你似乎处于二项式抽样情况,而 beta 回归只是一个近似值。

如果使用二项式似然,唯一的问题是如何适当地处理全 0 或全 1。用于标准逻辑回归的软件并不是一个真正的选择,因为它不会收敛(某些对数优势比的最大似然估计量将是,这会导致算法以一些非常大的估计和标准误差停止而不收敛)。有几个替代选项:±

  1. 如果您的场景真的像您的示例一样简单,并且您只有一个比例来估计每个组,并且没有协变量或实验结构(如随机化,在不同实验中一起发生的几种治疗等),您当然可以只使用Clopper-Pearson 置信区间和每个比例的中值无偏估计。

  2. 我认为您的实际问题更复杂,需要某种回归方法。在这种情况下,精确逻辑回归可以为您提供精确的置信区间(当然,有时这些区间的上限或下限将是)和中值无偏估计。与其他方法相比,它的软件选项更少(例如,SAS 中的 PROC LOGISTIC 以及 StatXact 涵盖了它,而 R - 据我所知 - 仅通过包的 MCMC 方法*接近它)。在没有协变量和任何其他需要考虑的情况下,精确逻辑回归最终将与选项 (0) 相同。±elrm

  3. Firth 惩罚似然法(对应于贝叶斯最大后验估计,Jeffreys 先验所有系数,包括截距),有时会导致一些奇怪的估计(但相当合理的置信区间)。

  4. 具有一些合适先验的贝叶斯逻辑回归。这通常比选项 1 和 2 表现得稍好,给你更多的灵活性,甚至让你反映任何特定的先验知识(但不强迫你,你可以保持你的先验相当模糊或信息量很弱)。

  5. 假设信息应该在某些单元之间借用的分层模型(无论是否贝叶斯)(即向共同参数收缩)。

(4) 和(5) 有很多好的软件,例如在R 中有brmsandrstanarm包。

* 关于elrm“声称”通过 MCMC 方法进行精确逻辑回归的包,我过去曾尝试过,但不确定它是否能很好地逼近精确解。例如,这里是一个简单的示例,它提供的结果在数值上与我倾向于信任的 SAS 实现完全不同:

library(elrm) 
elrmfit1 = elrm(y/n ~ treatment, 
                interest = ~treatment, 
                r=2, iter = 100000, burnIn = 500, 
                dataset = data.frame(y=c(0, 10), 
                                     n=c(10,10), 
                                     treatment=factor(c(0,1)))) 
summary(elrmfit1)

这产生了 3.9839 的对数优势比的估计值,95% CI 从 2.119672 到 Inf。相比之下,SAS 中的 PROC LOGISTIC 产生的对数优势比为 4.7723,95% CI 为 2.7564 至无穷大。