2013-07-26 20 views
13

Nel mio set di dati ho un numero di variabili continue e dummy. Per l'analisi con glmnet, voglio che le variabili continue siano standardizzate ma non le variabili dummy.In che modo l'argomento standardize di glmnet gestisce le variabili dummy?

Attualmente lo faccio manualmente definendo un vettore fittizio di colonne che hanno solo valori di [0,1] e quindi utilizzando il comando scale su tutte le colonne non fittizie. Il problema è che non è molto elegante.

Ma glmnet ha un argomento incorporato in standardize. Di default questo standardizzerà anche i manichini? In tal caso, c'è un modo elegante per dire all'argomento standardize di glmnet di saltare i manichini?

+0

Perché stai facendo tutto quel lavoro extra? –

+0

@DWin Non vedo un altro modo. Se glmnet non discrimina, allora ho bisogno di farlo. Come ho appena postato qui sotto, se non possiamo interpretare un coefficiente su una variabile dummy standardizzata, allora ho bisogno di separare i manichini da non-dummies prima della standardizzazione. –

risposta

10

In breve, sì - questo standardizzerà le variabili dummy, ma c'è un motivo per farlo. La funzione glmnet accetta una matrice come input per il suo parametro X, non un frame di dati, quindi non fa la distinzione per le colonne factor che si possono avere se il parametro era un data.frame. Se si prende uno sguardo alla funzione R, codici glmnet il parametro standardize internamente come

isd = as.integer(standardize) 

che converte i booleano R per un 0 o 1 intero per alimentare una qualsiasi delle funzioni FORTRAN interne (elnet, Lognet, et ..! al)

Se si va ancora di più esaminando il codice FORTRAN (larghezza fissa - vecchia scuola), si vedrà il seguente blocco:

  subroutine standard1 (no,ni,x,y,w,isd,intr,ju,xm,xs,ym,ys,xv,jerr) 989 
      real x(no,ni),y(no),w(no),xm(ni),xs(ni),xv(ni)      989 
      integer ju(ni)              990 
      real, dimension (:), allocatable :: v          
      allocate(v(1:no),stat=jerr)           993 
      if(jerr.ne.0) return             994 
      w=w/sum(w)               994 
      v=sqrt(w)                995 
      if(intr .ne. 0)goto 10651            995 
      ym=0.0                995 
      y=v*y                 996 
      ys=sqrt(dot_product(y,y)-dot_product(v,y)**2)       996 
      y=y/ys                997 
    10660 do 10661 j=1,ni              997 
      if(ju(j).eq.0)goto 10661            997 
      xm(j)=0.0                997 
      x(:,j)=v*x(:,j)              998 
      xv(j)=dot_product(x(:,j),x(:,j))          999 
      if(isd .eq. 0)goto 10681            999 
      xbq=dot_product(v,x(:,j))**2           999 
      vc=xv(j)-xbq               1000 
      xs(j)=sqrt(vc)              1000 
      x(:,j)=x(:,j)/xs(j)             1000 
      xv(j)=1.0+xbq/vc              1001 
      goto 10691               1002 

Date un'occhiata alle linee contrassegnate 1000 - In pratica si applica la formula di standardizzazione a t lui matrice X.

Ora, statisticamente parlando, non si standardizzano generalmente le variabili categoriali per mantenere l'interpretabilità dei regressori stimati. Tuttavia, come sottolineato da Tibshirani here, "Il metodo lazo richiede la standardizzazione iniziale dei regressori, in modo che lo schema di penalizzazione sia corretto per tutti i regressori.Per i regressori categoriali, si codifica il regressore con variabili dummy e poi si normalizzano le variabili dummy" - quindi mentre questo causa un ridimensionamento arbitrario tra variabili continue e categoriali, è fatto per un trattamento di penalizzazione uguale.

+2

Ho fatto alcuni [simile a scavare] (https: // thinklab.com/discussion/computing-standardized-logistic-regression-coefficients/205 # 5) per confermare il modo in cui glmnet stava ri-trasformando i coefficienti dopo il fitting sulle variabili standardizzate. Funtran :-) –

+0

dall'aiuto di 'glmnet':" I coefficienti vengono sempre restituiti sulla scala originale ". Quindi, l'interpretabilità dei coefficienti non dovrebbe essere un problema. – pbahr

+0

Mentre i coefficienti sono "sulla scala originale", la penalizzazione L1 e L2 distorce intrinsecamente i coefficienti del regressore per cercare di ridurre la varianza (vedi [Bias-Variance Tradeoff] (https://en.wikipedia.org/wiki/Bias%E2 % 80% 93variance_tradeoff)), il che significa che non dovrebbero essere trattati come stime imparziali di effetto sul valore della variabile dipendente. Solo un chiarimento :) –

3

glmnet non sapere nulla di variabili dummy, perché non dispone di un'interfaccia formula (e quindi non tocca model.frame e model.matrix.) Se si desidera loro di essere trattati in modo speciale, dovrete fare tu stesso.

+0

E 'OK lasciare che i manichini siano standardizzati? –

+2

Rispondendo alla mia stessa domanda, sopra. ** No, non è OK standardizzare i manichini. ** Citando http://www.sagepub.com/upm-data/21120_Chapter_7.pdf, pagina 140: "un coefficiente non standardizzato per un regressore fittizio è interpretabile come la risposta attesa -differenziabile differenza tra una particolare categoria e la categoria di base per il set di regressione fittizia (controllando, ovviamente, per le altre variabili esplicative nel modello) .Se un coefficiente dummy-regressor è standardizzato, allora questa semplice interpretazione viene persa. " –

+0

@R_User Vuoi aggiungere una risposta in base al tuo commento? Potrei quindi accettare la tua come risposta. –