2015-03-07 3 views
6

Dopo aver eseguito m1 <- lm(f1, data=DT) Voglio salvare le osservazioni che sono incluse (come "obs < - complete.cases (m1)", ma qualcosa che funziona) così che posso eseguire una seconda regressione sulle stesse osservazioni: m2 <- lm(f2, data=DT[obs]).R: Estrai casi completi/osservazioni incluse dal modello lineare o variabili formula

In alternativa, vorrei ottenere le osservazioni complete per un determinato insieme di variabili definito da un oggetto formula. Considera questo pseudocodice simile a R:

f1 <- as.formula("y ~ x1 + x2 + x3") 
f2 <- as.formula("y ~ x1 + x2") 
obs <- complete.cases(DT[,list(all.vars(f1)]) 
m2 <- lm(f2, data=DT[obs]) 

Come faccio? Nel primo caso, lm esegue già il lavoro implicitamente; come posso estrarlo? Nel secondo, all.vars restituisce un vettore di caratteri; come posso creare correttamente un elenco non quotato che DT (data.table) comprenderà?

+1

'obs <- complete.cases (DT [, c (all.vars (f1)), con = FALSE])' –

+0

Questo risponde alla mia domanda. Per inciso, 'obs <- complete.cases (DT [, all.vars (f1), with = FALSE])' funziona anche dal momento che 'all.vars' restituisce un vettore di caratteri. Ho provato il flag 'with' (' lista (f1), con = TRUE') ma non funziona. – rjturn

+0

Poiché 'list' esegue una valutazione non standard all'interno dell'ambiente' data.table', il che significa che riceve nomi di variabili non quotate. –

risposta

4

Da data.table v1.9.5, na.omit ha un argomento cols.

na.omit(DT, cols = all.vars(f)) 
+0

Sì, penso che questo risponda anche alla mia domanda, anche se non l'ho provato. Sembra anche più pulito. Grazie Arun. – rjturn

0

Supponendo che il na.action della tua chiamata lm() sia il na.omit predefinito, perché non chiamare semplicemente na.omit sui dati originali?

# create some missing values 
mtcars$disp <- ifelse(runif(nrow(mtcars)) > 0.8, NA, mtcars$disp) 

# fit model 
m1 <- lm(mpg ~ disp, data = mtcars) 

na.omit(mtcars[ , c("mpg", "disp")]) 

Controllare il file di aiuto per na.omit per alternative.

+0

Grazie per la risposta, ma questo non risponde alla mia domanda. 'na.omit (data [sottoinsieme])' è equivalente a 'data [complete.cases (data [subset])]' ed è forse più conciso, ma il problema riguarda la creazione del sottoinsieme da formule (o vettori di caratteri tramite ' all.vars (f) '). – rjturn