我试图在一个data.table中做一些glm,以生成被关键因素分割的建模结果。
我这么做很成功是因为:
但是,当我尝试用十进制列在作用域中执行高级别glm时,它会产生这个错误。
Error in model.frame.default(formula = Outcome ~ IntCol + DecCol, data = x, :
variable lengths differ (found for 'DecCol')我认为这可能是由于分区长度的变化造成的,所以我用一个可重复的例子进行了测试:
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的总结并没有说明应该有什么问题:
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也许我今天很迷茫,但谁能提出解决办法或进一步深入研究这个问题的方法呢?
发布于 2013-09-25 11:43:50
您需要在data中正确地指定glm参数。在data.table内部(使用[),这是由.SD引用的。(有关问题见create a formula in a data.table environment in R )
所以
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可能会陷入混乱的环境中。
发布于 2020-10-22 09:50:57
除了@mnel的答案之外,您还可以通过使用适当的函数提取合适的值并在na.action中指定适当的glm来避免数据中NAs的问题。
modellingDF[, list(Outcome, fitted =
fitted(glm(data = .SD,
formula = Outcome ~ IntCol ,
family = binomial(link = logit),
na.action=na.exclude)
), by=variable]这将返回具有与原始数据相同大小的拟合值的对象,保留NAs,但将它们排除在模型估计之外。
https://stackoverflow.com/questions/19001792
复制相似问题