R中的逻辑回归:glm()与rxGlm()

问题描述 投票:2回答:1

我在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包,我偶尔将自己画在这样的角落,因为似乎没有其他人使用它)

r logistic-regression glm revoscaler
1个回答
0
投票

我在这里盲目飞行,因为我自己无法在RevoScaleR中进行验证-但是您会尝试发表评论吗?然后,我可以相应地编辑/删除此信息

如果因变量需要是二进制的,则必须扩展数据,以便每一行对应于每个1或0响应,然后在没有weights参数的glm调用中运行此扩展数据。

我试图通过在示例中向df_reprex贴上标签,然后制作一个相应的df_reprex_expanded来演示这一点,我知道这很不幸,因为您说要使用的数据已经很大。

[g0(C0)是否允许rxLogit表示,就像glm()一样(我以cbind为例),因为那将允许数据保持相同的大小…从glm1b开始,我猜不是for rxLogit,但考虑到rxLogit page中的以下注意事项,rxGLM可能允许它:

公式通常由响应组成,在大多数RevoScaleR中函数可以是单个变量,也可以是多个变量组合使用cbind,“〜”运算符和一个或多个预测变量,通常用“ +”运算符分隔。 rxSummary函数通常需要一个没有响应的公式。

在下面的示例中,formula pageglm_2b是否起作用?

glm_2c
© www.soinside.com 2019 - 2024. All rights reserved.