2012-07-04 11 views
6

Ho cercato di capire come funziona l'argomento subset nella funzione R lm(). In particolare il codice follwoing sembra dubbia per me:Come funziona l'argomento sottoinsieme nella funzione lm()?

data(mtcars) 
summary(lm(mpg ~ wt, data=mtcars)) 
summary(lm(mpg ~ wt, cyl, data=mtcars)) 

In ogni caso la regressione ha 32 osservazioni

dim(lm(mpg ~ wt, cyl ,data=mtcars)$model) 
    [1] 32 2 
    dim(lm(mpg ~ wt ,data=mtcars)$model) 
    [1] 32 2 

ancora i coefficienti cambiano (insieme al R²). La guida non fornisce troppe informazioni su questo argomento:

sottoinsieme un vettore opzionale che specifica un sottoinsieme di osservazioni da utilizzare nel processo di adattamento

+0

Se si lavora con sottoinsiemi non numerici, non dimenticare di utilizzare le virgolette. – user3598724

risposta

12

Come principio generale, i vettori utilizzati in sottoinsiemi può essere logico (ad esempio un VERO o FALSO per ogni elemento) o numerico (ad esempio un numero). Come caratteristica per aiutare con il campionamento, se è numerico R includerà lo stesso elemento più volte se appare in un vettore numerico di subsetting.

Diamo uno sguardo a cyl:

> mtcars$cyl 
[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4 

Quindi stai ricevendo un data.frame della stessa lunghezza, ma è composto da riga 6, riga 6, fila 4, riga 6, etc.

potete vedere questo se si fa la subsetting da soli:

> head(mtcars[mtcars$cyl,]) 
       mpg cyl disp hp drat wt qsec vs am gear carb 
Valiant  18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 
Valiant.1  18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 
Valiant.2  18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 
Merc 240D  24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 
Valiant.3  18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 

Volevi fare qualcosa di simile?

summary(lm(mpg ~ wt, cyl==6, data=mtcars)) 
+0

grazie per la rapida risposta! Supponevo che funzionasse così ma nel mio codice attuale il sottoinsieme usava gli indici di riga che non erano nei dati (questi venivano rilasciati dalla funzione 'lm()') che mi confondeva ancora di più;). In realtà mi sono imbattuto in questo perché ho accidentalmente aggiunto una virgola :) carri armati di nuovo! – Seb