R - 在data.table中使用glm

Ste*_*cke 6 r glm data.table

我正在尝试在data.table中做一些glm来生成按关键因素分割的建模结果.

我一直在做这个成功的:

  • 高水平的glm

    glm(modellingDF,formula =结果~IntCol + DecCol,family =二项式(link = logit))

  • 单列旋转glm

    modellingDF [,list(结果,拟合= glm(x,公式=结果~IntCol,family =二项式(link = logit))$拟合),by = variable]

  • 带有两个整数列的scmped glm

    modellingDF [,list(结果,拟合= glm(x,公式=结果~IntCol + IntCol2,family =二项式(link = logit))$拟合),by = variable]

但是,当我尝试使用我的十进制列在范围内执行高级别的glm时,会产生此错误

Error in model.frame.default(formula = Outcome ~ IntCol + DecCol, data = x,  : 
  variable lengths differ (found for 'DecCol')
Run Code Online (Sandbox Code Playgroud)

我想也许是因为分区长度不一,所以我测试了一个可重复的例子:

library("data.table")

testing<-data.table(letters=sample(rep(LETTERS,5000),5000),
                    letters2=sample(rep(LETTERS[1:5],10000),5000), 
                    cont.var=rnorm(5000),
                    cont.var2=round(rnorm(5000)*1000,0),
                    outcome=rbinom(5000,1,0.8)
                    ,key="letters")
testing.glm<-testing[,list(outcome,
                  fitted=glm(x,formula=outcome~cont.var+cont.var2,family=binomial(link=logit))$fitted)
        ),by=list(letters)]
Run Code Online (Sandbox Code Playgroud)

但这没有错误.我想也许这是由于NAs或其他东西,但数据摘要.table modellingDF没有表明应该有任何问题:

DecCol
Min.   :0.0416
1st Qu.:0.6122
Median :0.7220
Mean   :0.6794
3rd Qu.:0.7840
Max.   :0.9495

nrow(modellingDF[is.na(DecCol),])   # results in 0

modellingDF[,list(len=.N,DecCollen=length(DecCol),IntCollen=length
(IntCol ),Outcomelen=length(Outcome)),by=Bracket]

  Bracket  len DecCollen IntCollen Outcomelen
1:     3-6 39184  39184       39184      39184
2:     1-2 19909  19909       19909      19909
3:       0  9912   9912        9912       9912
Run Code Online (Sandbox Code Playgroud)

也许我有一个慵懒的一天,但是有人可以提出解决方案或进一步深入研究这个问题的方法吗?

mne*_*nel 6

您需要在其中正确指定data参数glm.在data.table(使用[)内部,这被引用.SD.(请参阅在R中的data.table环境中创建相关问题的公式)

所以

modellingDF[,list(Outcome, fitted = glm(data = .SD, 
  formula = Outcome ~ IntCol ,family = binomial(link = logit))$fitted),
 by=variable]
Run Code Online (Sandbox Code Playgroud)

将工作.

虽然在这种情况下(简单地提取拟合值并继续),这种方法是合理的,使用data.table并且.SD如果您保存整个模型然后尝试update它,可能会陷入混乱的环境(请参阅为什么在lm上使用更新)在分组的data.table中丢失其模型数据?)

  • 这个答案有点过时了。`modellingDF[,.(Outcome,fitting = glm(Outcome ~ IntCol,family = binomial)$fitted), by=variable]`应该可以工作并且更干净。 (2认同)