R中二项式glm中响应的输入格式


13

在中R,有三种方法可以使用glm函数来格式化输入数据以进行逻辑回归:

  1. 对于每个观察,数据可以采用“二进制”格式(例如,对于每个观察,y = 0或1);
  2. 数据可以采用“ Wilkinson-Rogers”格式(例如y = cbind(success, failure)),每一行代表一种治疗;要么
  3. 数据可以是每个观测值的加权格式(例如,y = 0.3,权重= 10)。

这三种方法均产生相同的系数估计值,但自由度以及由此产生的偏差值和AIC分数不同。后两种方法具有较少的观测值(因此也具有自由度),因为它们将每种处理用于观测值的数量,而第一种方法将每种观测值用作观测值的数量。

我的问题:使用一种输入格式比使用另一种输入格式有数字或统计优势吗?我看到的唯一好处是不必重新格式化数据R即可与模型一起使用。

我查看了glm文档,在网络上搜索了该站点,发现了一个与切向相关的帖子,但没有有关该主题的指导。

这是一个模拟示例,演示了此行为:

# Write function to help simulate data
drc4 <- function(x, b =1.0, c = 0, d = 1, e = 0){
    (d - c)/ (1 + exp(-b * (log(x)  - log(e))))
}
# simulate long form of dataset
nReps = 20
dfLong <- data.frame(dose = rep(seq(0, 10, by = 2), each = nReps))
dfLong$mortality <-rbinom(n = dim(dfLong)[1], size = 1,
                              prob = drc4(dfLong$dose, b = 2, e = 5))

# aggregate to create short form of dataset
dfShort <- aggregate(dfLong$mortality, by = list(dfLong$dose), 
                     FUN = sum)
colnames(dfShort) <- c("dose", "mortality")
dfShort$survival <- nReps - dfShort$mortality 
dfShort$nReps <- nReps
dfShort$mortalityP <- dfShort$mortality / dfShort$nReps

fitShort <- glm( cbind(mortality, survival) ~ dose, 
                 data = dfShort, 
                 family = "binomial")
summary(fitShort)

fitShortP <- glm( mortalityP ~ dose, data = dfShort, 
                  weights = nReps,     
                  family = "binomial")
summary(fitShortP)

fitLong <- glm( mortality ~ dose, data = dfLong, 
                family = "binomial")
summary(fitLong)

1
在您的示例中,所有三个模型的零偏差和残余偏差之间的差异均相等。如果添加或删除参数,则所有三个参数的AIC更改也相同。
强尼·罗蒙德

1
您回答自己:如果使用相同的数据得出相同的结果,那么它们又有什么不同?此外,如果该方法仅由于提供不同格式的数据而给出不同的结果,则该方法及其实现将存在严重问题。
蒂姆

WR格式最终是加权似然。权重的问题是R无法分辨它们是频率权重,概率权重还是其他权重。例如,使用调查权重,您可能只有n个观察值,但它们代表了总体/抽样框架的各个部分。因此,自由度的确是100。svyglm通过调查软件包,您可以更好地处理权重参数。
AdamO

但是,如果您使用所有三种编码方式拟合准二项式模型,它们会产生不同的结果,对,因为当编码为二项式数据时,可能会产生正的过度分散,而编码为逻辑/二进制数据时,则不会有正的过度分散。还是我错了?
Tom Wenseleers

Answers:


9

除了概念上的明确性之外,没有统计上的理由要选择一个。尽管报告的偏差值不同,但是这些差异完全是由于饱和模型造成的。因此,由于饱和模型的对数似然性会抵消,因此在模型之间使用相对偏差的任何比较都不会受到影响。

我认为进行显式偏差计算非常有用。

模型的偏差为2 *(LL(饱和模型)-LL(模型))。假设您有不同的像元,其中是像元的观测值数目,是像元所有观测值的模型预测,是第个观测值的观测值(0或1)在单元格。iniipiiyijji

长表

(建议或为空)模型的对数似然为

ij(log(pi)yij+log(1pi)(1yij))

饱和模型的对数似然为这等于0,因为为0或1。注意是未定义的,但为方便起见,请阅读作为简写。,为0。

ij(log(yij)yij+log(1yij)(1yij)).
yijlog(0)0log(0)limx0+xlog(x)

简短形式(加权)

请注意,二项分布实际上不能取非整数值,但是我们仍然可以通过使用每个单元格中观察到的成功分数作为响应,并通过对数似然计算对每个求和加权来计算“对数似然”。该单元格中的观察数。

ini(log(pi)jyij/ni+log(1pi)(1j(yij/ni))

这恰好等于我们上面计算出的模型偏差,您可以通过将长形方程中的和尽可能多地来看到。j

同时,饱和偏差是不同的。由于我们不再具有0-1响应,因此即使每个观察值只有一个参数,我们也无法精确得到0。相反,饱和模型的对数似然为

ini(log(jyij/ni)jyij/ni+log(1jyij/ni)(1jyij/ni)).

在您的示例中,您可以验证两个模型的报告的空偏差值和残差偏差值之间的差是此数量的两倍。

ni = dfShort$nReps
yavg = dfShort$mortalityP
sum.terms <-ni*(log(yavg)*yavg + log(1 - yavg)*(1 - yavg))
# Need to handle NaN when yavg is exactly 0
sum.terms[1] <- log(1 - yavg[1])*(1 - yavg[1])

2*sum(sum.terms)
fitShortP$deviance - fitLong$deviance

我认为您必须澄清饱和模型的偏差表达式。对数0的效果不佳。
AdamO '18年

谢谢,我应该弄清楚我的意思了。我添加了一个编辑,以澄清在这种情况下0log(0)表示0。
强尼·罗蒙德

好的,但是我很困惑(请原谅,我从未详细介绍过偏差):如果您有log(y)y-log(1-y)(1-y)作为饱和模型偏差,不是每个观察只是0?
AdamO '18年

2
“饱和模型”是每个观察值具有一个参数的虚拟模型。因此,根据实际观察值,其对每个观察的预测概率为1或0。因此,在这种情况下,饱和模型的对数似然度确实为0,该数据是唯一可以由饱和模型生成的数据。
强尼·罗蒙德

但是,如果您使用所有三种编码方式拟合准二项式模型,它们会产生不同的结果,对,因为当编码为二项式数据时,可能会产生正的过度分散,而编码为逻辑/二进制数据时,则不会有正的过度分散。还是我错了?
Tom Wenseleers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.