gpt4 book ai didi

r - 从数组生成数据框以进行逻辑回归

转载 作者:行者123 更新时间:2023-12-01 10:03:11 25 4
gpt4 key购买 nike

假设你有一个像这样的数组

dat <-  array(c(126, 100, 35, 61, 908, 688, 497, 807, 913, 747, 336, 598, 235, 172, 58, 121,402, 308, 121, 215, 182, 156, 72, 98, 60, 99, 11, 43, 104, 89, 21, 36), dim = c(2, 2, 8),dimnames = list(a = c(1, 0), b = c(1, 0), c = 1:8))


> > dat
, , c = 1

b
a 1 0
1 126 35
0 100 61

, , c = 2

b
a 1 0
1 908 497
0 688 807

, , c = 3

b
a 1 0
1 913 336
0 747 598

, , c = 4

b
a 1 0
1 235 58
0 172 121

, , c = 5

b
a 1 0
1 402 121
0 308 215

, , c = 6

b
a 1 0
1 182 72
0 156 98

, , c = 7

b
a 1 0
1 60 11
0 99 43

, , c = 8

b
a 1 0
1 104 21
0 89 36

并且您想拟合逻辑回归来预测 a。有没有一种简单的方法可以从此数组生成数据框以在 glm 中使用?即像

这样的数据框
a b c
1 1 1 for 126 rows then
...
0 1 1 for 100 rows, etc.

基本上,当给定带有计数的表时,我需要获取数据以适应逻辑回归。似乎应该有一种无需手动生成数据的简单方法。

谢谢

最佳答案

一种方法是从 reshape2 包中的 melt 函数开始:

library(reshape2)

datM <- melt(dat)
head(datM, 2)
# a b c value
# 1 1 1 1 126
# 2 0 1 1 100

然后 dcast 该数据以获得一行中的结果数:

dat2 <- dcast(datM, b + c ~ a)
head(dat2, 2)
# b c 0 1
# 1 0 1 61 35
# 2 0 2 807 497

然后您可以使用此数据执行 glm,其中响应是一个包含成功和失败次数的 2 列矩阵:

response <- as.matrix(dat2[, c(4, 3)])
bb <- dat2[, "b"]
cc <- dat2[, "c"]
glm1 <- glm(response ~ bb + cc, family = binomial(link = "logit"))

但是,模型自由度(和对数似然等)不会反射(reflect)您在问题中要求的数据结构。要获得您想要的特定数据结构,您可以返回到 datM 对象。

编辑:

以下循环遍历 datM 的所有列,value 列除外,重复值 datM$value 次:

datRep <- lapply(datM[-grep("value", names(datM))], rep, times = datM$value)

然后 cbind 返回到 matrix 并转换为 data.frame 以获得您想要的数据结构:

dat3 <- as.data.frame(do.call(cbind, datRep))

glm2 <- glm(a ~ b + c, data = dat3, family = binomial(link = "logit"))

两个模型的系数相同:

> coef(glm1)
(Intercept) bb cc
-0.43854838 0.77039283 -0.03328575
> coef(glm2)
(Intercept) b c
-0.43854838 0.77039283 -0.03328575

但是,如前所述,自由度等不会:

> glm1$deviance
[1] 29.39535
> glm2$deviance
[1] 11381.87

关于r - 从数组生成数据框以进行逻辑回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13791657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com