我在 R 中安装了很多 GLM。通常我使用revoScaleR::rxGlm()
它是因为我使用大型数据集并使用非常复杂的模型公式 - 而且glm()
无法应对。
在过去,这些都是基于泊松或伽马错误结构和日志链接功能。这一切都很好。
今天我正在尝试建立一个逻辑回归模型,这是我以前在 R 中没有做过的,我偶然发现了一个问题。我正在使用revoScaleR::rxLogit()
虽然revoScaleR::rxGlm()
产生相同的输出 - 并且有同样的问题。
考虑这个代表:
df_reprex <- data.frame(x = c(1, 1, 2, 2), # number of trials
y = c(0, 1, 0, 1)) # number of successes
df_reprex$p <- df_reprex$y / df_reprex$x # success rate
# overall average success rate is 2/6 = 0.333, so I hope the model outputs will give this number
glm_1 <- glm(p ~ 1,
family = binomial,
data = df_reprex,
weights = x)
exp(glm_1$coefficients[1]) / (1 + exp(glm_1$coefficients[1])) # overall fitted average 0.333 - correct
glm_2 <- rxLogit(p ~ 1,
data = df_reprex,
pweights = "x")
exp(glm_2$coefficients[1]) / (1 + exp(glm_2$coefficients[1])) # overall fitted average 0.167 - incorrect
第一次调用glm()
产生正确的答案。第二次调用rxLogit()
没有。阅读以下文档rxLogit()
:https ://docs.microsoft.com/en-us/machine-learning-server/r-reference/revoscaler/rxlogit它指出“因变量必须是二进制的”。
所以看起来rxLogit()
需要我y
用作因变量而不是p
. 但是,如果我跑
glm_2 <- rxLogit(y ~ 1,
data = df_reprex,
pweights = "x")
我得到一个总体平均值
exp(glm_2$coefficients[1]) / (1 + exp(glm_2$coefficients[1]))
取而代之的是 0.5,这也不是正确答案。
有谁知道我该如何解决这个问题?我是否需要offset()
在模型公式中使用一个术语,或者更改权重,或者...
(通过使用这个revoScaleR
包我偶尔把自己画成这样的角落,因为似乎没有多少其他人使用它)