Je commence à me familiariser avec l’utilisation de glmnet
avec LASSO Regression, où mon résultat d’intérêt est dichotomique. J'ai créé un petit cadre de données fictif ci-dessous:
age <- c(4, 8, 7, 12, 6, 9, 10, 14, 7)
gender <- c(1, 0, 1, 1, 1, 0, 1, 0, 0)
bmi_p <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88)
m_edu <- c(0, 1, 1, 2, 2, 3, 2, 0, 1)
p_edu <- c(0, 2, 2, 2, 2, 3, 2, 0, 0)
f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow",
"red", "yellow")
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)
# df is a data frame for further use!
df <- data.frame(age, gender, bmi_p, m_edu, p_edu, f_color, asthma)
Les colonnes (variables) de l'ensemble de données ci-dessus sont les suivantes:
age
(âge de l'enfant en années) - continugender
- binaire (1 = mâle; 0 = femelle)bmi_p
(Percentile IMC) - continum_edu
(niveau d'éducation le plus élevé de la mère) - ordinal (0 = inférieur au lycée; 1 = diplôme d'études secondaires; 2 = baccalauréat; 3 = diplôme post-baccalauréat)p_edu
(niveau d'éducation le plus élevé du père) - ordinal (identique à m_edu)f_color
(couleur primaire préférée) - nominal ("bleu", "rouge" ou "jaune")asthma
(statut de l'asthme de l'enfant) - binaire (1 = asthme; 0 = pas d'asthme)
L'objectif de cet exemple est d'utiliser Lasso pour créer un modèle prédictif de l' état de l' asthme de l' enfant dans la liste des 6 variables prédictives potentiels ( age
, gender
, bmi_p
, m_edu
, p_edu
et f_color
). Évidemment, la taille de l'échantillon est un problème ici, mais j'espère mieux comprendre comment gérer les différents types de variables (c.-à-d. Continues, ordinales, nominales et binaires) dans le glmnet
cadre lorsque le résultat est binaire (1 = asthme 0 = pas d'asthme).
En tant que tel, est-ce que n'importe qui serait disposé à fournir un exemple de R
script avec des explications pour cet exemple factice utilisant LASSO avec les données ci-dessus pour prédire le statut d'asthme? Bien que très basique, je sais que moi-même et probablement beaucoup d’autres sur CV apprécierions beaucoup cela!
la source
dput
d'un objet R réel ; Ne faites pas que les lecteurs mettent du glaçage sur le dessus et ne vous fassent pas cuire un gâteau!. Si vous générez le cadre de données approprié dans R, par exemplefoo
, éditez ensuite la question dans la questiondput(foo)
.glmnet
en action avec un résultat binaire.Réponses:
Les variables catégorielles sont généralement d'abord transformées en facteurs, puis une matrice de variables indicatrices factices est créée et, avec les prédicteurs continus, est transmise au modèle. Gardez à l'esprit que glmnet utilise les pénalités de crête et de lasso, mais peut être réglé sur l'une ou l'autre.
Quelques résultats:
Les coefficients peuvent être extraits du glmmod. Ici montré avec 3 variables sélectionnées.
Enfin, la validation croisée peut également être utilisée pour sélectionner lambda.
la source
f_color
variable? Les facteurs de facteurs 1 à 4 sont-ils considérés comme une étape plus grande que 1 à 2 ou sont-ils tous pondérés de manière égale, non directionnels et catégoriques? (Je veux l'appliquer à une analyse avec tous les prédicteurs non ordonnés.)xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[,-1]
code la variable catégorielle f_color (telle que déclarée paras.factor
les lignes précédentes). Il devrait utiliser le codage par défaut de la variable factice R, sauf si l'contrasts.arg
argument est fourni. Cela signifie que tous les niveaux de f_color sont également pondérés et non directionnels, à l'exception du premier qui est utilisé comme classe de référence et absorbé dans l'interception.model.matrix(asthma ~ gender + m_edu + p_edu + f_color + age + bmi_p)[, -1]
donnerait pas le même résultat que les deux lignes ci-dessus? Pourquoi utiliser une étape supplémentaire pour concaténer les variables continuesdata.frame
?Je vais utiliser le paquet enet puisque c'est ma méthode préférée. C'est un peu plus flexible.
la source
elasticnet
; Cependant, je ne sais pas quoi faire de la sortie duR
script ci-dessus . Pouvez-vous clarifier s'il vous plait? Merci d'avance!Juste pour développer l'excellent exemple fourni par pat. Le problème original posait des variables ordinales (m_edu, p_edu), avec un ordre inhérent entre les niveaux (0 <1 <2 <3). Dans la réponse originale de pat, je pense qu'elles ont été traitées comme des variables nominales nominales sans ordre entre elles. Je me trompe peut-être, mais je crois que ces variables devraient être codées de manière à ce que le modèle respecte leur ordre inhérent. Si ceux-ci sont codés comme des facteurs ordonnés (plutôt que comme des facteurs non ordonnés comme dans la réponse de pat), alors glmnet donne des résultats légèrement différents ... Je pense que le code ci-dessous inclut correctement les variables ordinales en tant que facteurs ordonnés, et donne des résultats légèrement différents:
la source