首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在data.table中使用glm

在data.table中使用glm
EN

Stack Overflow用户
提问于 2013-09-25 09:59:17
回答 2查看 3K关注 0票数 6

我试图在一个data.table中做一些glm,以生成被关键因素分割的建模结果。

我这么做很成功是因为:

  • 高水平glm modellingDF,formula=Outcome~IntCol + DecCol,family=binomial(link=logit))
  • 单列作用域glm modellingDF,列表(结果,fitted=glm(x,formula=Outcome~IntCol,family=binomial(link=logit))$fitted ),by=variable
  • 两个整数列的作用域glm modellingDF,列表(结果,fitted=glm(x,formula=Outcome~IntCol + IntCol2,family=binomial(link=logit))$fitted ),by=variable

但是,当我尝试用十进制列在作用域中执行高级别glm时,它会产生这个错误。

代码语言:javascript
复制
Error in model.frame.default(formula = Outcome ~ IntCol + DecCol, data = x,  : 
  variable lengths differ (found for 'DecCol')

我认为这可能是由于分区长度的变化造成的,所以我用一个可重复的例子进行了测试:

代码语言:javascript
复制
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)]

但这并没有错误。我想可能是因为NAs之类的原因,但是对data.table modellingDF的总结并没有说明应该有什么问题:

代码语言:javascript
复制
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

也许我今天很迷茫,但谁能提出解决办法或进一步深入研究这个问题的方法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-25 11:43:50

您需要在data中正确地指定glm参数。在data.table内部(使用[),这是由.SD引用的。(有关问题见create a formula in a data.table environment in R )

所以

代码语言:javascript
复制
modellingDF[,list(Outcome, fitted = glm(data = .SD, 
  formula = Outcome ~ IntCol ,family = binomial(link = logit))$fitted),
 by=variable]

会起作用的。

虽然在这种情况下(只需提取合适的值并继续前进),这种方法是正确的,如果您保存整个模型,然后尝试对其进行data.table (参见Why is using update on a lm inside a grouped data.table losing its model data?),则使用update.SD可能会陷入混乱的环境中。

票数 8
EN

Stack Overflow用户

发布于 2020-10-22 09:50:57

除了@mnel的答案之外,您还可以通过使用适当的函数提取合适的值并在na.action中指定适当的glm来避免数据中NAs的问题。

代码语言:javascript
复制
modellingDF[, list(Outcome, fitted = 
   fitted(glm(data = .SD, 
       formula = Outcome ~ IntCol ,
       family = binomial(link = logit),
       na.action=na.exclude)
   ), by=variable]

这将返回具有与原始数据相同大小的拟合值的对象,保留NAs,但将它们排除在模型估计之外。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19001792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档