2012-06-21 16 views
6

Sto utilizzando glmnet per prevedere le probabilità in base a un set di 5 funzioni utilizzando il seguente codice. Ho bisogno della formula attuale perché ho bisogno di usarla in un programma diverso (non R).Interpretazione dei nomi dei coefficienti in glmnet in R

deg = 3 

glmnet.fit <- cv.glmnet(poly(train.matrix,degree=deg),train.result,alpha=0.05,family='binomial') 

I nomi dei coefficienti risultanti hanno cinque posizioni (presumo questo è uno di ciascuna caratteristica) e ognuno di essi è un numero compreso tra 0 e 3 (si considera questo è il grado del polinomio). Ma sono ancora confuso su come ricostruire esattamente la formula.

prendere questi per esempio:

> coef(glmnet.fit,s= best.lambda) 
(Intercept) -2.25e-01 
... 
0.1.0.0.1 3.72e+02 
1.1.0.0.1 9.22e+04 
0.2.0.0.1 6.17e+02 
... 

Chiamiamo il caratteristiche A, B, C, D, E. È così che la formula dovrebbe essere interpretata?

Y = 
-2.25e-01 + 
... 
(3.72e+02 * (B * E) + 
(9.22e+04 * (A * B * E) + 
(6.17e+02 * (B^2 + E) 
... 

Se ciò non è corretto, come dovrei interpretarlo?

Ho visto il seguente question and answer ma non ha risolto questi tipi di nomi dei coefficienti.

Grazie in anticipo per il vostro aiuto.

risposta

6

In genere, viene utilizzata la funzione di previsione. Nel tuo caso, hai bisogno dei coefficienti da usare in un altro programma. Possiamo verificare l'accordo tra l'utilizzo della previsione e il risultato della moltiplicazione dei dati per i coefficienti.

# example data 

library(ElemStatLearn) 
library(glmnet) 
data(prostate) 

# training data 

data.train <- prostate[prostate$train,] 
y <- data.train$lpsa 

# isolate predictors 

data.train <- as.matrix(data.train[,-c(9,10)]) 

# test data 

data.test <- prostate[!prostate$train,] 
data.test <- as.matrix(data.test[,-c(9,10)]) 

# fit training model 

myglmnet =cv.glmnet(data.train,y) 

# predictions by using predict function 

yhat_enet <- predict(myglmnet,newx=data.test, s="lambda.min") 

# get predictions by using coefficients 

beta <- as.vector(t(coef(myglmnet,s="lambda.min"))) 

# Coefficients are returned on the scale of the original data. 
# note we need to add column of 1s for intercept 

testX <- cbind(1,data.test) 
yhat2 <- testX %*% beta 

# check by plotting predictions 

plot(yhat2,yhat_enet) 

Quindi ogni coefficiente corrisponde a una colonna nei dati di allenamento. Il primo corrisponde all'intercetta. In breve, puoi estrarre i coefficienti e moltiplicare per i dati del test per ottenere i risultati che ti interessano.

+0

Grazie per la risposta. Sfortunatamente, non sono ancora sicuro su come convertire quei nomi e valori dei coefficienti in una formula. "Quindi ogni coefficiente corrisponde a una colonna nei dati di allenamento". Questo non può essere vero. Ho ~ 80 coefficienti diversi da zero. Ma ho solo 5 colonne di dati di allenamento. Penso che ognuno di quei numeri separati da un periodo probabilmente corrisponde a una delle mie colonne. Qualche secondo parere? – dougp

+0

Controlla le colonne di: polyData <- poly (train.matrix, degree = deg). poly sta espandendo i tuoi dati di allenamento (da 5 colonne a ~ 80) con polinomi ortogonali. È quello che stai cercando? Vedrai che ci sono nuove colonne/nomi e questi corrispondono ai coefficienti. – julieth

+0

Capisco. Questo aiuta molto. Grazie. L'ho provato una volta senza "poly" e una volta con degree = 1 e le cose erano più chiare. Mentre approfondisco questo aspetto, sembra che la mia ricostruzione generale della formula sia corretta tranne che per una cosa. Penso che le caratteristiche A, B, C, D, E siano in realtà polinomi ortogonali (non i dati grezzi). – dougp