2012-06-21 1 views
6

J'utilise glmnet pour prédire des probabilités basées sur un ensemble de 5 caractéristiques en utilisant le code suivant. J'ai besoin de la formule actuelle car je dois l'utiliser dans un programme différent (non R).Interprétation des noms de coefficients dans glmnet dans R

deg = 3 

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

Les noms des coefficients résultants ont cinq positions (je suppose que c'est l'une de chaque fonction) et chacun d'eux est un nombre compris entre 0 et 3 (je suppose que c'est le degré du polynôme). Mais je suis encore confus sur la façon exacte de reconstruire la formule.

Prenez par exemple ces:

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

Appelons les fonctions A, B, C, D, E. Est-ce ainsi que la formule devrait être interprétée?

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

Si cela est correct pas comment dois-je interpréter?

J'ai vu le suivant question and answer mais il n'a pas abordé ces types de noms de coefficient.

Merci d'avance pour votre aide.

Répondre

6

Habituellement, nous utilisons la fonction de prédiction. Dans votre cas, vous avez besoin des coefficients à utiliser dans un autre programme. Nous pouvons vérifier l'accord entre l'utilisation de prédire et le résultat de la multiplication des données par les coefficients.

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

Chaque coefficient correspond à une colonne dans vos données d'entraînement. Le premier correspond à l'interception. En résumé, vous pouvez extraire les coefficients et les multiplier par les données de test pour obtenir les résultats qui vous intéressent.

+0

Merci pour votre réponse. Malheureusement, je ne suis toujours pas sûr de savoir comment convertir ces noms et valeurs de coefficients en une formule. "Donc, chaque coefficient correspond à une colonne dans vos données d'entraînement". Cela ne peut pas être vrai. J'ai ~ 80 coefficients non nuls. Mais je n'ai que 5 colonnes de données d'entraînement. Je pense que chacun de ces nombres séparés par des périodes correspond probablement à l'une de mes colonnes. Des opinions secondaires? – dougp

+0

Consultez les colonnes de: polyData <- poly (train.matrix, degree = deg). poly étend vos données d'entraînement (de 5 cols à ~ 80) avec des polynômes orthogonaux. Est-ce ce que vous cherchez? Vous verrez qu'il y a de nouvelles colonnes/noms et ceux-ci correspondent aux coefficients. – julieth

+0

Je vois. Cela aide beaucoup. Je vous remercie. J'ai essayé ceci une fois sans "poly" et une fois avec degré = 1 et les choses étaient plus claires. Comme je l'examine plus, il semble que ma reconstruction générale de la formule est correcte, sauf pour une chose. Je pense que les caractéristiques A, B, C, D, E sont en fait des polynômes orthogonaux (pas les données brutes). – dougp

Questions connexes