6

data.table 内でいくつかの glm を実行して、主要な要因で分割されたモデル化された結果を生成しようとしています。

私はこれをうまくやっています:

  • ハイレベルGLM

    glm(modellingDF,formula=Outcome~IntCol + DecCol,family=binomial(link=logit))

  • 単一列のスコープ付き glm

    modellingDF[,list(結果, 適合=glm(x,式=結果~IntCol ,家族=二項(リンク=ロジット))$適合), by=変数]

  • 2 つの整数列を持つスコープ付き glm

    modellingDF[,list(結果, 適合=glm(x,式=結果~IntCol + IntCol2 ,family=binomial(リンク=ロジット))$適合), by=変数]

しかし、小数列を使用してスコープ内で高レベルの 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)]

しかし、これにはエラーがありませんでした。おそらくNAか何かが原因だと思いましたが、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

おそらく私は居眠りをしているかもしれませんが、この問題をさらに掘り下げるための解決策または手段を誰か提案できますか?

4

2 に答える 2

8

data内で引数を正しく指定する必要がありますglmdata.table(を使用して)内で[は、これは によって参照され.SDます。(関連する質問については、R の data.table 環境で式を作成するを参照してください)

そう

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

動作します。

この場合(単純に適合値を抽出して先に進む)、このアプローチは健全でdata.tableあり.SD、モデル全体を保存してからそれを試みている場合、環境の混乱に陥る可能性があります( lmで更新を使用する理由をupdate参照してくださいグループ化された data.table 内でモデル データが失われますか? )

于 2013-09-25T11:43:50.320 に答える
0

@mnel の回答に加えて、適切な関数を使用して近似値を抽出し、適切なna.actioninを指定することで、データ内の NA に関する問題を回避できglmます。

modellingDF[, list(Outcome, fitted = 
   fitted(glm(data = .SD, 
       formula = Outcome ~ IntCol ,
       family = binomial(link = logit),
       na.action=na.exclude)
   ), by=variable]

これにより、元のデータと同じサイズの適合値を持つオブジェクトが返され、NA は保持されますが、モデル推定から除外されます。

于 2020-10-22T09:50:57.400 に答える