我在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
包,我偶尔将自己画在这样的角落,因为似乎没有其他人使用它)
我在这里盲目飞行,因为我自己无法在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 page或
glm_2b
是否起作用?
glm_2c