Regressão múltipla com preditores categóricos e numéricos

10

Sou relativamente novo em R e estou tentando ajustar um modelo aos dados que consistem em uma coluna categórica e uma coluna numérica (número inteiro). A variável dependente é um número contínuo.

Os dados têm o seguinte formato:

predCateg, predIntNum, ResponseVar

Os dados são mais ou menos assim:

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

Como eu modelaria isso (presumivelmente, usando um GLM), em R?

[[Editar]]

Apenas me ocorreu (depois de analisar os dados mais detalhadamente), que a variável independente categórica é de fato ordenada. Por isso, modifiquei a resposta fornecida anteriormente da seguinte maneira:

> 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

Estou um pouco confuso com o que ordered(ranking).C, ordered(ranking).Qe ordered(ranking).Lmédia na saída, e gostaria de receber alguma ajuda na compreensão desta saída, e como usá-lo para prever a variável resposta.

Homunculus Reticulli
fonte

Respostas:

11

Tente o seguinte:

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

O factor()comando garantirá que R saiba que sua variável é categórica. Isso é especialmente útil se suas categorias forem indicadas por números inteiros, caso contrário, o glm interpretará a variável como contínua.

O factor(ranking) * age_in_yearstermo informa R que você deseja incluir o termo de interação.

P Schnell
fonte
1
porque factor(ranking)e não as.factor(ranking)?
Peter Flom
1
Eu costumo usar factor(x)para poder incluir o levelsargumento, se desejar. Você também pode usar, as.factor(x)se desejar, e pode ser mais rápido, mas acho que você precisaria de um conjunto de dados bastante grande para que a velocidade dessas funções seja importante.
P: Schnell 03/03
@PSchnell +1 para obter uma resposta concisa e uma boa explicação. Uma coisa, porém, é que percebi que o fator está ordenado. Modifiquei ligeiramente a fórmula que você forneceu para refletir o fato (veja minha pergunta editada). No entanto, não tenho certeza de que entendi a saída do modelo (especificamente ordered(ranking).C, ordered(ranking).Qe ordered(ranking).L- o que eles significam e como usá-lo para prever a variável de resposta?) - qualquer ajuda será muito apreciada. Obrigado
Homunculus Reticulli
1
.L,, .Qe .Csão, respectivamente, os coeficientes para o fator ordenado codificado com contrastes linear, quadrático e cúbico. O comando contr.poly(4)mostrará a matriz de contraste para um fator ordenado com 4 níveis (3 graus de liberdade, e é por isso que você obtém um polinômio de terceira ordem). contr.poly(4)[2, '.L']lhe dirá o que conectar para o segundo nível ordenado no termo linear. Esteja ciente de que isso pressupõe que faz sentido considerar os níveis igualmente espaçados. Caso contrário, codifique sua própria matriz de contraste.
precisa
2
De acordo com ats.ucla.edu/stat/r/library/contrast_coding.htm#ORTHOGONAL , em R, quando uma variável contínua é modelada em resposta a uma variável fator ordenada, o contraste padrão aplicado é a codificação polinomial ortogonal onlinecourses.science.psu .edu / stat502 / node / 203 . stats.stackexchange.com/a/206345/90600 tem uma explicação bastante extensa. stats.stackexchange.com/a/207128/90600 vai ainda mais fundo.
Paul de Barros
2

Recentemente, respondi a variável dependente contínua com variável independente ordinal , recomendando a ordSmoothfunção no ordPenspacote. Isso usa regressão penalizada para suavizar os coeficientes fictícios nos níveis de uma variável ordinal, para que eles não variem muito de um nível para o outro. Por exemplo, você provavelmente não gostaria que category_Ao coeficiente fosse muito mais diferente do category_Bque category_N. Você provavelmente desejaria que os coeficientes aumentassem ou diminuíssem monotonicamente, ou pelo menos mudassem gradualmente entre fileiras. Minha resposta à pergunta vinculada lista referências para mais informações.

ordSmoothtambém pode acomodar variáveis ​​contínuas (e nominais); no seu caso, o código pode ser:

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

ordSmoothrequer entrada numérica para dados ordinais, daí a as.numeric(ordered())reformatação. zé para um vetor numérico / matriz / data.framede preditores contínuos. lambdaé o coeficiente de suavização - valores maiores empurrarão seus coeficientes para mais perto de zero. Pode ser sensato começar pequeno aqui. A impressão SmoothFitfornecerá coeficientes e valores adequados, mas receio que deixe o resto para você.

No seu método, os coeficientes ordered(ranking).C/ .Q/ .Lparecem rotulados como cúbicos, quadráticos e lineares, respectivamente. Se você tentar glm(rnorm(10)~ordered(rep(1:5,2))), também receberá um coeficiente ordered(rep(1:5, 2))^4. Não sei ao certo por que esses são indicados com expoentes; Não acho que esteja modelando esses termos como termos polinomiais, porque os coeficientes são diferentes glm(y~x+I(x^2)+I(x^3)+I(x^4))e variam em escala disso. Eles devem ser códigos fictícios básicos .

Nick Stauner
fonte