2012-06-21 9 views
6

Estoy usando glmnet para predecir probabilidades en base a un conjunto de 5 funciones que utilizan el siguiente código. Necesito la fórmula actual porque necesito usarla en un programa diferente (no R).Interpretación de nombres de coeficientes en glmnet en R

deg = 3 

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

Los nombres de los coeficientes resultantes tienen cinco posiciones (yo supongo que este es uno de cada característica) y cada uno de ellos es un número entre 0 y 3 (I asumir este es el grado del polinomio). Pero todavía estoy confundido sobre cómo exactamente reconstruir la fórmula.

tomar estos por ejemplo:

> 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 
... 

Llamemos a las características A, B, C, D, E. ¿Es así como debe interpretarse la fórmula?

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

Si eso no es correcto, ¿cómo debo interpretarlo?

Vi el siguiente question and answer pero no se ocupó de estos tipos de nombres de coeficientes.

Gracias de antemano por su ayuda.

Respuesta

6

Por lo general, utilizamos la función de predicción. En su caso, necesita los coeficientes para usar en otro programa. Podemos verificar el acuerdo entre usar predicción y el resultado de multiplicar los datos por los coeficientes.

# 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) 

Por lo tanto, cada coeficiente corresponde a una columna en sus datos de entrenamiento. El primero corresponde a la intersección. En resumen, puede extraer los coeficientes y multiplicar por los datos de prueba para obtener los resultados que le interesan.

+0

Gracias por su respuesta. Lamentablemente, todavía no estoy seguro de cómo convertir esos nombres de coeficientes y valores en una fórmula. "Entonces cada coeficiente corresponde a una columna en sus datos de entrenamiento". Eso no puede ser cierto. Tengo ~ 80 coeficientes distintos de cero. Pero solo tengo 5 columnas de datos de entrenamiento. Creo que cada uno de esos números separados por un período probablemente corresponde a una de mis columnas. Cualquier segunda opinión? – dougp

+0

Eche un vistazo a las columnas de: polyData <- poly (train.matrix, degree = deg). poly expande tus datos de entrenamiento (de 5 cols a ~ 80) con polinomios ortogonales. ¿Es eso lo que estás buscando? Verás que hay nuevas columnas/nombres y estos coinciden con los coeficientes. – julieth

+0

Ya veo. Eso ayuda mucho. Gracias. Intenté esto una vez sin "poli" y una vez con grado = 1 y las cosas fueron más claras. Al analizar esto más, parece que mi reconstrucción general de la fórmula es correcta, excepto por una cosa. Creo que las características A, B, C, D, E son en realidad polinomios ortogonales (no los datos brutos). – dougp

Cuestiones relacionadas