Spørsmål:
Hvordan NA-verdiene blir behandlet i glm i R
user1140126
2012-12-30 02:52:30 UTC
view on stackexchange narkive permalink

Jeg har en datatabell T1, som inneholder nesten tusen variabler (V1) og rundt 200 millioner datapunkter. Dataene er sparsomme, og de fleste oppføringene er NA. Hvert datapunkt har et unikt id og datopar for å skille fra et annet.

Jeg har en annen tabell T2, som inneholder et eget sett med variabler (V2). Denne tabellen har også id og datopar som unikt identifiserer oppføringer i T2.

Vi mistenker at dataene i T1 kan brukes til å forutsi verdier av variabler i T2.

For å bevise dette, tenkte jeg å bruke 'glm' modell i R og sjekke om vi virkelig kan finne noen variabler i T2 som er avhengig av variabler i T1.

For hver variabel i T2 begynte jeg å trekke ut alle data i T1 med samme ID og datopar som resulterte i mye mindre ~ 50K datapunkter for noen av testvariablene.

Problemene jeg står overfor nå med bruk av glm er som følger.

  1. I noen tilfeller viser det meg en feil "fit not found" og advarte "glm.fit: algoritme konvergerte ikke". Jeg er ikke sikker på hvorfor vises det?

  2. Hvordan NA behandles i glm? Fjerner det alle poster som involverer 'NA' først og utfører deretter tilpasning?

  3. Er det en god strategi å fjerne alle NA først og deretter kalle 'glm'. Jeg frykter at dette kan redusere datapunktene betydelig, ettersom de fleste av dem er NA-er.

  4. Hvilken metode brukes for å beregne koeffisientene. Jeg kunne ikke finne noe nettsted eller papir eller bok som diskuterte hvordan resultatet beregnes.

Jeg testet glm med og uten 'NAs' og fant forskjellige svar som poeng NAs er vurderes mens dataene tilpasses:

Eksempel 1:

  > tmpData x1 x2 x3 Y1 1 1 1 32 1 0 4 53 1 2 3 64 0 3 1 4Anrop: glm (formel = as.formel (lim inn (dep, "~", lim inn (xn, kollaps = "+"))), na.action = na. ekskluder) Koeffisienter: (Intercept) as.numeric (unlist (tmpData [" x1 "])) as.numeric (unlist (tmpData [" x2 "]))
5.551e-16 1.000e + 00 1.000e + 00 som.nummer (unlist (tmpData ["x3"])) 1.000e + 00 Frihetsgrader: 3 Total (dvs. Null); 0 ResidualNull Deviation: 5 Residual Deviance: 9.861e-31 AIC: -260.6 

Eksempel 2:

  'x1' 'x2' 'x3' ' Y'100000 1 NA 21 1 1 31 NA -1124 21 0 4 51 2 3 60 3 1 4 Koeffisienter: (Intercept) as.numeric (unlist (tmpData ["x1"])) as.numeric (unlist (tmpData ["x2) "])) som.numeric (unlist (tmpData [" x3 "])) -2.3749044 -0.0000625 0.6249899 1.8749937 Grader av frihet: 5 Total (dvs. null); 2 ResidualNull Deviance: 13.33 Residual Deviance: 1.875 AIC: 20.05  
En svar:
MattBagg
2012-12-30 08:27:33 UTC
view on stackexchange narkive permalink

NA-håndtering: Du kan kontrollere hvordan GLM håndterer manglende data. glm () har et argument na.action som indikerer hvilke av følgende generiske funksjoner som skal brukes av glm for å håndtere NA i dataene:

  • na .omit og na.exclude : observasjoner fjernes hvis de inneholder manglende verdier; hvis na.exclude brukes, vil noen funksjoner pute rester og spådommer til riktig lengde ved å sette inn NA-er for utelatte tilfeller. li>
  • na.fail : returnerer bare objektet hvis det ikke inneholder verdier som mangler

Hvis du ikke angir na.action, glm () vil sjekke Rs globale alternativer for å se om en standard er satt der. Du får tilgang til alternativene dine med getOption ("na.action") eller -alternativer ("na.action") , og du kan angi det med for eksempel alternativer (na.action = "na.omit") Fra R-utgangen du oppgir i eksempel 1 ser det ut til at du setter inn na.action = na.omit . Så ja, i det tilfellet i det minste fjerner du alle tilfeller / rader med NA før montering. Videre er jeg ganske sikker på at na.action = na.pass vil føre til at glm () mislykkes når dataene har NAs (prøv det).

Feil: glm () bruker en iterativ prosedyre (itererte vektede minste kvadrater; IWLS) for å gjøre estimater for maksimal sannsynlighet. Noen ganger får du feil fordi det bare vil gå gjennom et forhåndsdefinert antall iterasjoner, og hvis det ikke har en god passform da, gir det opp. Dette tallet styres av argumentet maxit, som standard er maxit = 25 . Du kan prøve å sette den høyere, men selvfølgelig vil dette ta lengre tid. (Hvis du angir trace = TRUE , vil det vise deg resultatet av hver iterasjon.)

Andre informasjonskilder: Hjelpefilen for glm er tilgjengelig med ? glm eller help (glm) og forklarer mye av dette. To andre nyttige ressurser er:

Jeg kan være klar på dette: glm vil ikke bruke rader som inneholder NA, uansett hva du setter 'na.action' til.Å bruke `na.fail` vil kaste en feil,` na.pass` vil bare utsette feilen, `na.omit` og` na.exclude` vil fjerne radene.Den underliggende lineære algebrakoden har ingen mulighet til å håndtere manglende data.


Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...