Interpretação do coeficiente em um modelo de regressão linear com variáveis ​​categóricas

8

Vou dar meus exemplos com chamadas R. Primeiro, um exemplo simples de regressão linear com uma variável dependente 'vida útil' e duas variáveis ​​explicativas contínuas.

data.frame(height=runif(4000,160,200))->human.life
human.life$weight=runif(4000,50,120)
human.life$lifespan=sample(45:90,4000,replace=TRUE)
summary(lm(lifespan~1+height+weight,data=human.life))

Call:
lm(formula = lifespan ~ 1 + height + weight, data = human.life)

Residuals:
Min       1Q   Median       3Q      Max 
-23.0257 -11.9124  -0.0565  11.3755  23.8591 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 63.635709   3.486426  18.252   <2e-16 ***
height       0.007485   0.018665   0.401   0.6884    
weight       0.024544   0.010428   2.354   0.0186 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 13.41 on 3997 degrees of freedom
Multiple R-squared: 0.001425,   Adjusted R-squared: 0.0009257 
F-statistic: 2.853 on 2 and 3997 DF,  p-value: 0.05781

Para encontrar a estimativa de 'vida útil' quando o valor de 'peso' é 1, adiciono (Interceptação) + altura = 63,64319

Agora, e se eu tiver um quadro de dados semelhante, mas um em que uma das variáveis ​​explicativas seja categórica?

data.frame(animal=rep(c("dog","fox","pig","wolf"),1000))->animal.life
animal.life$weight=runif(4000,8,50)
animal.life$lifespan=sample(1:10,replace=TRUE)
summary(lm(lifespan~1+animal+weight,data=animal.life))

Call:
lm(formula = lifespan ~ 1 + animal + weight, data = animal.life)

Residuals:
Min      1Q  Median      3Q     Max 
-4.7677 -2.7796 -0.1025  3.1972  4.3691 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 5.565556   0.145851  38.159  < 2e-16 ***
animalfox   0.806634   0.131198   6.148  8.6e-10 ***
animalpig   0.010635   0.131259   0.081   0.9354    
animalwolf  0.806650   0.131198   6.148  8.6e-10 ***
weight      0.007946   0.003815   2.083   0.0373 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Residual standard error: 2.933 on 3995 degrees of freedom
Multiple R-squared: 0.01933,    Adjusted R-squared: 0.01835 
F-statistic: 19.69 on 4 and 3995 DF,  p-value: 4.625e-16

Nesse caso, para encontrar a estimativa de 'tempo de vida' quando o valor de 'peso' é 1, devo adicionar cada um dos coeficientes de 'animal' à interceptação: (Interceptação) + animalfox + animalpig + animalwolf? Ou qual é a maneira correta de fazer isso?

Obrigado Sverre

Sverre
fonte
cifrões fazem você entrar em um ambiente de equação e é por isso que as coisas ficam aleatoriamente em itálico.
Macro
formatação: para obter code, recuar por 4 espaços.
wolf.rauch
se você usar os 4 espaços recuados, poderá colocar estrelas e cifrões e eles aparecerão como tal. se você usá-los fora da formatação do código, eles serão tratados como marcação. Se você não quer uma completa codelinha, use backticks:this is code with a $ and *
wolf.rauch
1
É bom que você tenha usado um exemplo reproduzível. Você pode melhorar ainda mais o exemplo incluindo set.seed(1)(ou qualquer número que desejar) antes de executar a geração aleatória de números, para que todos obtenham exatamente os mesmos resultados que você (embora isso não importe muito nesse caso).
wolf.rauch
Apenas dois pequenos comentários. Você escreveu "Para encontrar a estimativa de 'vida útil' quando o valor de 'peso' é 1, eu adiciono (Interceptação) + altura = 63,64319". Observe que essa é a vida útil média estimada quando o peso é = 1 e a altura = 0 . Provavelmente isso não é muito significativo. Além disso, previsões fora da faixa dos valores observados das variáveis ​​independentes precisam ser tratadas com cautela (o peso está entre 50 e 120, portanto peso = 1 também não é muito significativo). Apenas algumas notas e provavelmente coisas que você já sabia. Mas apenas no caso ...
Wolfgang

Respostas:

12

Não, você não deve adicionar todos os coeficientes. Você essencialmente tem o modelo

euEufespuman=β0 0+β1fox+β2pEug+β3Woeuf+β4WeEught+ε

onde, por exemplo, pEug=1se o animal era um porco e 0 em caso contrário. Então, para calcularβ0 0+β1+β2+β3+β4 como você sugeriu para obter a média geral quando WeEught=1é como dizer "se você fosse um porco, um lobo e uma raposa, e seu peso fosse 1, qual é a sua expectativa de vida?". Claramente, já que cada animal é apenas uma dessas coisas, isso não faz muito sentido.

Você terá que fazer isso separadamente para cada animal. Por exemplo,β0 0+β2+β4 é a expectativa de vida útil de um porco quando seu peso é 1.

Macro
fonte
Macro: eu entendo. Faria sentido, então, encontrar o coeficiente médio para os níveis em 'animal'? Em outras palavras, faça (Intercept) + (animalfox + animalpig + animalwolf) / 3. Ou isso é válido apenas quando há um número igual de observações para cada animal no conjunto de dados?
Sverre 21/07
Acho que você está certo - isso só seria válido se houvesse um número igual em cada grupo. Você pode ponderá-los proporcionalmente à proporção com que cada grupo é representado na amostra se insistir em resumir em um número.
Macro
Qual seria a maneira correta de ponderá-los? A razão pela qual estou "insistindo" em resumi-lo em um número é que desejo desenhar a linha de regressão para apenas uma das variáveis ​​em um gráfico de dispersão. Por exemplo, no exemplo human.life acima, eu desenharia a linha de regressão para 'weight' especificando o intercepto da linha ((Intercepto) + altura = 63.64319) com seu coeficiente (0,024544). Isso é um pouco mais complicado no caso animal.life.
Sverre 22/07
Pensando mais sobre isso, não sei como qualquer tipo de média seria interpretável. Você poderia simplesmente desenhar três linhas de regressão paralelas em um gráfico, não é? Além disso, parece-me que o efeito do "peso" seria diferente para cada animal; nesse caso, você deveria ter um animal interagindo com o peso, o que levaria a três linhas de regressão completamente diferentes para cada animal.
Macro
Mas em um caso em que a variável para 'animal' e a variável para 'peso' são significativas, mas a interação delas não é, eu nem incluiria a interação no modelo. A regressão múltipla estima o efeito de 'peso' independentemente de qual é o valor para 'animal'.
Sverre
4

A coisa mais simples a fazer é usar a função de previsão no objeto lm, para cuidar de muitos detalhes, como converter um fator nos valores certos para adicionar. Se você está tentando entender as peças que entram na previsão, defina type='terms'e elas mostrarão as peças individuais que se juntam e fazem sua previsão.

Observe também que como um fator é convertido em variáveis ​​depende de algumas opções, o padrão escolherá um grupo de linha de base para comparar os outros grupos, mas você também pode configurá-lo para uma média e diferenças dessa média (ou outras comparações de interesse) .

Greg Snow
fonte
Usar o forecast.lm () é uma boa solução para um objeto lm. Infelizmente, na verdade, estou ajustando um objeto lmer aos meus dados, para os quais não existe nenhuma função predit () que extraia termos individuais. Entendi corretamente que o método alternativo que você está sugerindo definiria a interceptação como o valor médio, em vez de uma linha de base (onde todos os preditores contínuos são definidos como 0 e um valor de preditores categóricos é escolhido)? Nesse caso, eu gostaria de saber como fazer isso. Então eu poderia desenhar minha linha de regressão como a interceptação do modelo + o coeficiente do meu preditor.
Sverre 22/07
Veja? Contrastes,? C,? Contr.sum, e a parte de contrastes das? Opções.
Greg Neve
2

Se você deseja uma vida útil média quando o peso é 1, basta retirar "animal" nesta chamada:

lm(formula = lifespan ~ 1 + animal + weight, data = animal.life)
Peter Flom
fonte
Eu não entendo como isso pode estar certo. Se eu pegar um dos preditores ('animal'), o intercepto, o coeficiente de 'peso' e o erro estimam todas as mudanças. Além disso, não estou tentando descobrir qual é a vida útil média real do peso 1 nos dados, exatamente como o modelo prevê que deve ser.
Sverre 22/07