Régression multiple avec prédicteurs catégoriques et numériques

11

Je suis relativement nouveau dans R et j'essaie d'adapter un modèle à des données qui se composent d'une colonne catégorielle et d'une colonne numérique (entière). La variable dépendante est un nombre continu.

Les données ont le format suivant:

predCateg, predIntNum, ResponseVar

Les données ressemblent à ceci:

ranking, age_in_years, wealth_indicator
category_A, 99, 1234.56
category_A, 21, 12.34
category_A, 42, 234.56
....
category_N, 105, 77.27

Comment pourrais-je modéliser cela (probablement, en utilisant un GLM), dans R?

[[Éditer]]

Il m'est venu à l'esprit (après une analyse plus approfondie des données), que la variable indépendante catégorielle est en fait ordonnée. J'ai donc modifié la réponse fournie précédemment comme suit:

> fit2 <- glm(wealth_indicator ~ ordered(ranking) + age_in_years, data=amort2)
> 
> fit2

Call:  glm(formula = wealth_indicator ~ ordered(ranking) + age_in_years, 
    data = amort2)

Coefficients:
      (Intercept)  ordered(ranking).L  ordered(ranking).Q  ordered(ranking).C      age_in_years  
        0.0578500         -0.0055454         -0.0013000          0.0007603          0.0036818  

Degrees of Freedom: 39 Total (i.e. Null);  35 Residual
Null Deviance:      0.004924 
Residual Deviance: 0.00012      AIC: -383.2
> 
> fit3 <- glm(wealth_indicator ~ ordered(ranking) + age_in_years + ordered(ranking)*age_in_years, data=amort2)
> fit3

Call:  glm(formula = wealth_indicator ~ ordered(ranking) + age_in_years + 
    ordered(ranking) * age_in_years, data = amort2)

Coefficients:
                    (Intercept)                ordered(ranking).L                ordered(ranking).Q  
                      0.0578500                       -0.0018932                       -0.0039667  
              ordered(ranking).C                    age_in_years  ordered(ranking).L:age_in_years  
                      0.0021019                        0.0036818                       -0.0006640  
ordered(ranking).Q:age_in_years  ordered(ranking).C:age_in_years  
                      0.0004848                       -0.0002439  

Degrees of Freedom: 39 Total (i.e. Null);  32 Residual
Null Deviance:      0.004924 
Residual Deviance: 5.931e-05    AIC: -405.4

Je suis un peu confus par ce que ordered(ranking).C, ordered(ranking).Qet ordered(ranking).Lmoyenne dans la production, et apprécierait un peu d' aide pour comprendre cette sortie, et comment l'utiliser pour prédire la variable de réponse.

Homunculus Reticulli
la source

Réponses:

11

Essaye ça:

fit <- glm(wealth_indicator ~ 
           factor(ranking) + age_in_years + factor(ranking) * age_in_years)

La factor()commande s'assurera que R sait que votre variable est catégorique. Ceci est particulièrement utile si vos catégories sont indiquées par des entiers, sinon glm interprétera la variable comme continue.

Le factor(ranking) * age_in_yearsterme indique à R que vous souhaitez inclure le terme d'interaction.

P Schnell
la source
1
pourquoi factor(ranking)et non as.factor(ranking)?
Peter Flom
1
J'utilise habituellement factor(x)pour pouvoir inclure l' levelsargument si je le souhaite. Vous pouvez également l'utiliser as.factor(x)si vous le souhaitez, et cela peut en fait être plus rapide, mais je pense que vous auriez besoin d'un ensemble de données assez important pour que la vitesse de ces fonctions soit importante.
P Schnell
@PSchnell +1 pour une réponse concise et une bonne explication. Une chose cependant, c'est que j'ai réalisé que le facteur est ordonné. J'ai légèrement modifié la formule que vous avez fournie pour refléter ce fait (veuillez consulter ma question modifiée). Cependant, je ne suis pas sûr de comprendre la sortie du modèle (en particulier ordered(ranking).C, ordered(ranking).Qet ordered(ranking).L- que signifient-ils et comment puis-je l'utiliser pour prédire la variable de réponse?) - toute aide sera très appréciée. Merci
Homunculus Reticulli
1
.L,, .Qet .Csont, respectivement, les coefficients du facteur ordonné codés avec des contrastes linéaires, quadratiques et cubiques. La commande contr.poly(4)vous montrera la matrice de contraste pour un facteur ordonné à 4 niveaux (3 degrés de liberté, c'est pourquoi vous obtenez un polynôme de troisième ordre). contr.poly(4)[2, '.L']vous dira quoi brancher pour le deuxième niveau ordonné dans le terme linéaire. Sachez que cela suppose qu'il est logique de considérer les niveaux comme étant également espacés. Si ce n'est pas le cas, codez votre propre matrice de contraste.
P Schnell
2
Selon ats.ucla.edu/stat/r/library/contrast_coding.htm#ORTHOGONAL , dans R, lorsqu'une variable continue est modélisée en réponse à une variable de facteur ordonné, le contraste par défaut appliqué est le codage polynomial orthogonal onlinecourses.science.psu .edu / stat502 / node / 203 . stats.stackexchange.com/a/206345/90600 a des explications assez détaillées. stats.stackexchange.com/a/207128/90600 va encore plus loin.
Paul de Barros
2

J'ai récemment répondu Variable dépendante continue avec variable indépendante ordinale , recommandant la ordSmoothfonction dans le ordPenspackage. Cette méthode utilise une régression pénalisée pour lisser les coefficients fictifs à travers les niveaux d'une variable ordinale afin qu'ils ne varient pas trop d'un niveau à l'autre. Par exemple, vous ne voudriez probablement pas que category_Ale coefficient soit beaucoup plus différent de category_Bque de category_N. Vous voudriez probablement que les coefficients augmentent ou diminuent de façon monotone, ou du moins changent progressivement d'un rang à l'autre. Ma réponse à la question liée répertorie les références pour plus d'informations.

ordSmoothpeut également accueillir des variables continues (et nominales); dans votre cas, le code pourrait être:

SmoothFit=with(amort2,
ordSmooth(as.numeric(ordered(ranking)),wealth_indicator,z=age_in_years,lambda=.001))

ordSmoothnécessite une entrée numérique pour les données ordinales, d'où le as.numeric(ordered())reformatage. zest pour un vecteur numérique / matrice / data.framede prédicteurs continus. lambdaest le coefficient de lissage - des valeurs plus élevées rapprocheront vos coefficients de zéro. Pourrait être sage de commencer petit ici. L'impression SmoothFitvous donnera des coefficients et des valeurs ajustées, mais je crains que cela ne vous laisse le reste.

Dans votre méthode, les coefficients ordered(ranking).C/ .Q/ .Lsemblent être étiquetés comme cubique, quadratique et linéaire, respectivement. Si vous essayez glm(rnorm(10)~ordered(rep(1:5,2))), vous obtiendrez également un coefficient pour ordered(rep(1:5, 2))^4. Je ne sais pas vraiment pourquoi ceux-ci sont indiqués avec des exposants; Je ne pense pas que cela modélise ces termes comme des termes polynomiaux, car les coefficients sont différents glm(y~x+I(x^2)+I(x^3)+I(x^4))et leurs variantes sont mises à l'échelle. Il doit s'agir de codes factices de base .

Nick Stauner
la source