2013-09-25 12 views
5

Próbuję zrobić trochę glm wewnątrz pliku data.table, aby uzyskać modelowane wyniki podzielone przez kluczowe czynniki.R - używanie glm wewnątrz danych.tabela

Robiłem to z powodzeniem do:

  • Wysoki poziom GLM

    GLM (modellingDF, formuła = Wynik ~ IntCol + DecCol, rodzina = dwumianowy (link = logarytmicznej))

  • lunetą GLM z pojedynczej kolumny

    modellingDF [wykaz (wynik, wyposażone = GLM (x, o wzorze = Wynik ~ IntCol rodzina = dwumianowego (Li nk = logarytmicznej)) $ wyposażony) przez = zmienna]

  • lunetą GLM z dwoma kolumnami całkowitą

    modellingDF [wykaz (wynik, wyposażone = GLM (x, o wzorze = Wynik ~ IntCol + IntCol2 rodzina = dwumianowy (link = logarytmicznej)) $ zamontowane), przez = zmienna]

Ale gdy próbuję i zrobić GLM wysoki poziom wewnątrz zakresu z moim kolumnie dziesiętnych, produkuje ten błąd

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

Myślałem, że może to ze względu na zmienne długości partycji, więc testowałem z powtarzalny przykład:

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

Ale to nie ma błędu. Myślałem, że może to ze względu na NAS lub czegoś, ale streszczeniem data.table modellingDF nie daje żadnych wskazówek, że nie powinno być żadnych problemów:

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 

Może Mam dozy dzień, ale może ktoś sugerują rozwiązanie lub sposób na dalsze zgłębianie tego problemu?

+0

Co? [R Zmienna długość Różni się, gdy budujesz model liniowy dla reszty] (http://stackoverflow.com/questions/14924541/r-variable-length-differ-when-build-linear-model-for-residuals) – zx8754

+1

Rozważałem to, ale 'sapply (modellingDF, function (x) all (is.na (x)))' zwraca FALSE dla każdej kolumny –

+0

Czy możesz utworzyć powtarzalny przykład, który powoduje błąd? Pokazałeś błąd, który jest dobry, ale nie to, co go produkuje, iiuc. –

Odpowiedz

5

Musisz poprawnie określić argument data w ciągu glm. Wewnątrz data.table (przy użyciu [), jest to oznaczone przez .SD. (Patrz create a formula in a data.table environment in R dla powiązanego pytanie)

Więc

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

zadziała.

Chociaż w tym przypadku (po prostu wyodrębnianie wartości zamontowane i przejściem), takie podejście jest dźwięk, używając data.table i .SD można dostać w bałaganie środowiskach jeśli Oszczędzasz cały model, a następnie próbuje update go (patrz Why is using update on a lm inside a grouped data.table losing its model data?)

+0

Ta odpowiedź jest nieco przestarzała. 'modellingDF [,. (Wynik, dopasowany = glm (Wynik ~ IntCol, rodzina = dwumianowy) $ wyposażony), by = variable] 'powinno działać i jest znacznie czystsze. – MichaelChirico

Powiązane problemy