逻辑回归:分组变量和非分组变量(使用R)


9

我正在阅读A. Agresti(2007),《分类数据分析简介》,第二版。版本,并且不确定我是否正确理解本段(第106页,4.2.1)(尽管应该很容易):

在上一章有关打ing和心脏病的表3.1中,每天有254名受试者报告打呼night,其中30名患有心脏病。如果数据文件具有分组的二进制数据,则数据文件中的一行报告的样本量为254,其中30种是心脏病病例。如果数据文件具有未分组的二进制数据,则数据文件中的每一行都引用一个单独的主题,因此30行包含1的心脏病,而224行包含0的心脏病。这两种数据文件的ML估计值和SE值都相同。

转换一组未分组的数据(1个相关数据,1个独立数据)将花费更多的时间来包含所有信息!

在以下示例中,创建了一个(不切实际的!)简单数据集,并构建了逻辑回归模型。

分组数据的实际外观如何(变量标签?)?如何使用分组数据构建相同的模型?

> dat = data.frame(y=c(0,1,0,1,0), x=c(1,1,0,0,0))
> dat
  y x
1 0 1
2 1 1
3 0 0
4 1 0
5 0 0
> tab=table(dat)
> tab
   x
y   0 1
  0 2 1
  1 1 1
> mod1=glm(y~x, data=dat, family=binomial())

Answers:


11

表3.1复制如下:

在此处输入图片说明

Agresti考虑了以下打numerical水平的数字评分:{0,2,4,5}。

使GLM与R匹配的方法有两种:要么将结果作为0/1的向量提供,要么将因子作为两个水平的因子提供,且预测变量位于公式的rhs上;或者 或者您可以给出一个包含两列成功/失败次数的矩阵作为公式的lhs。后者对应于Agresti所谓的“分组”数据。第三种方法也适用于分组设置,该方法将使用该weights=参数来指示对于分类表的每个类别观察到多少阳性阴性结果。

矩阵视图中的数据为:

snoring <- matrix(c(24,35,21,30,1355,603,192,224), nc=2)

由此,我们可以生data.frame成长格式(2484行= sum(snoring)观察值),如下所示:

snoring.df <- data.frame(snoring=gl(4, 1, labels=c("Never", "Occasional",
                                                   "Nearly every night", 
                                                   "Every night")),
                         disease=gl(2, 4, labels=c("Yes", "No")),
                         counts=as.vector(snoring))
snoring.df <- snoring.df[rep(seq_len(nrow(snoring.df)), snoring.df$counts), 1:2]

以下两个模型将产生相同的结果:

levels(snoring.df$snoring) <- c(0, 2, 4, 5)
y <- abs(as.numeric(snoring.df$disease)-2)
x <- as.numeric(as.character(snoring.df$snoring))
fit.glm1 <- glm(y ~ x, family=binomial)

fit.glm2 <- glm(snoring ~ c(0, 2, 4, 5), family=binomial)

也就是说,使用Agresti的符号。Logit[π^X]=-3.87+0.40X

第二种表示法经常在带有诸如的指令的聚合表上使用cbind(a, b),其中ab是二进制事件的计数列(例如,参见Generalized Linear Models)。看起来在使用表而不是矩阵时也可以使用(例如您的示例),例如

glm(as.table(snoring) ~ c(0, 2, 4, 5), family=binomial)

非常感谢你!一个完美的答案!我有一个简单的补充:我建议使用table(x,y,dnn = c('snoring','disease'))代替as.table(snoring),因为从ungrouped到grouped的转换数据也很有趣。
FloE

1
@FloE你是对的。您仍然需要临时构建rhs 。例如,类似的方法tab <- table(x,y, dnn=c('snoring','disease')); glm(tab ~ as.numeric(rownames(tab)), family=binomial)会起作用(系数的负号反转,因为“是”被编码为0而不是1)。
chl 2012年
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.