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

机器算法验证 r 广义线性模型 物流
2022-03-11 21:21:36

我正在阅读 A. Agresti (2007), An Introduction to Categorical Data Analysis,第 2 期。版,并且不确定我是否正确理解了这一段(p.106, 4.2.1)(尽管应该很容易):

在上一章关于打鼾与心脏病的表 3.1 中,254 名受试者报告每晚打鼾,其中 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())
1个回答

表 3.1 转载如下:

在此处输入图像描述

Agresti 考虑了以下打鼾水平的数字分数:{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)

那是,罗吉特[π^(X)]=-3.87+0.40X, 使用 Agresti 的符号。

第二种表示法经常用在聚合表上,其指令如下cbind(a, b),其中ab是二进制事件的计数列(例如,参见广义线性模型)。看起来它在使用表格而不是矩阵时也可以工作(如您的示例),例如

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