2013-09-25 9 views
5

Sto cercando di fare un po 'di GLM all'interno di un data.table per produrre risultati modellati divisi da fattori chiave.R - usando GLM all'interno di un data.table

Ho fatto questo con successo per:

  • alto livello glm

    glm (modellingDF, formula = Esito ~ IntCol + DecCol, famiglia = binomio (link = logit))

  • glm Scoped con colonne singole

    modellingDF [, list (esito, montato = glm (x, formula = Esito ~ IntCol, famiglia = binomiale (li nk = logit)) $ montato), da = variabile]

  • glm Scoped con due colonne integer

    modellingDF [, list (esito, montato = glm (x, formula = Esito ~ IntCol + IntCol2 , famiglia = binomio (link = logit)) $ montato), da = variabile]

Ma, quando provo e faccio il glm alto livello all'interno del campo di applicazione con la mia colonna decimale, produce questo errore

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

ho pensato forse era a causa di lunghezze variabili delle partizioni, così ho provato con un esempio riproducibile:

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)] 

Ma questo non ha avuto l'errore. Ho pensato che forse era dovuto al NAS o qualcosa, ma una sintesi della data.table modellingDF non fornisce alcuna indicazione che ci dovrebbe essere problemi:

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 

Forse sto avendo un giorno sonnolento, ma chiunque potrebbe suggerire un soluzione o un mezzo per approfondire ulteriormente questo problema?

+0

NAS? [R lunghezza variabile differiscono quando modello lineare di generazione per residui] (http://stackoverflow.com/questions/14924541/r-variable-length-differ-when-build-linear-model-for-residuals) – zx8754

+1

ho ritenuto, ma 'sapply (modellingDF, function (x) all (is.na (x)))' restituisce FALSE per ogni colonna –

+0

Puoi fare un esempio riproducibile che produce l'errore? Hai mostrato l'errore che è buono, ma non quello che lo produce, iiuc. –

risposta

5

è necessario specificare correttamente l'argomento data all'interno glm. All'interno di un data.table (utilizzando [), questo si riferisce a .SD. (Vedi create a formula in a data.table environment in R per la domanda relativa)

Così

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

funzionerà.

Mentre in questo caso (è sufficiente estrarre i valori stimati e andare avanti), questo approccio è il suono, utilizzando data.table e .SD può ottenere in un pasticcio di ambienti, se si sta salvando l'intero modello e poi di tentare di update (vedi Why is using update on a lm inside a grouped data.table losing its model data?)

+0

Questa risposta è un po 'obsoleta. 'modellingDF [,. (Risultato, adattato = glm (Risultato ~ IntCol, famiglia = binomiale) $ corrisposto), di = variabile] 'dovrebbe funzionare ed è molto più pulito. – MichaelChirico