poli() em lm(): diferença entre bruto e ortogonal



(2)

eu tenho

library(ISLR)
attach(Wage)

# Polynomial Regression and Step Functions

fit=lm(wage~poly(age,4),data=Wage)
coef(summary(fit))

fit2=lm(wage~poly(age,4,raw=T),data=Wage)
coef(summary(fit2))

plot(age, wage)
lines(20:350, predict(fit, newdata = data.frame(age=20:350)), lwd=3, col="darkred")
lines(20:350, predict(fit2, newdata = data.frame(age=20:350)), lwd=3, col="darkred")

As linhas de previsão parecem as mesmas, no entanto, por que os coeficientes são tão diferentes? Como você os interpreta em raw=T e raw=F

Vejo que os coeficientes produzidos com poly(...,raw=T) correspondem aos com ~age+I(age^2)+I(age^3)+I(age^4) .

Se eu quiser usar os coeficientes para obter a previsão "manualmente" (sem usar a função predict() ), há algo em que devo prestar atenção? Como devo interpretar os coeficientes dos polinômios ortogonais em poly() .


Answer #1

Acredito que a maneira como a regressão polinomial seria executada com base em raw=T é que se olha o termo de maior potência e avalia sua significância com base no pvalue desse coeficiente.

Se não for encontrado significativo ( pvalue grande), a regressão será executada novamente sem esse poder não significativo em particular (isto é, o próximo nível mais baixo) e isso será realizado um passo de cada vez, reduzindo se não for significativo.

Se a qualquer momento o grau mais alto for significativo, o processo parará e afirmará que esse grau é o apropriado.


Answer #2

Por padrão, com raw = FALSE , poly() calcula um polinômio ortogonal. Ele internamente configura a matriz do modelo com a codificação bruta x, x ^ 2, x ^ 3, ... primeiro e depois dimensiona as colunas para que cada coluna seja ortogonal às anteriores. Isso não altera os valores ajustados, mas tem a vantagem de poder ver se uma determinada ordem no polinômio melhora significativamente a regressão nas ordens inferiores.

Considere os dados simples dos cars com a resposta interrompendo a distância e a speed condução. Fisicamente, isso deve ter uma relação quadrática, mas neste conjunto de dados (antigo) o termo quadrático não é significativo:

m1 <- lm(dist ~ poly(speed, 2), data = cars)
m2 <- lm(dist ~ poly(speed, 2, raw = TRUE), data = cars)

Na codificação ortogonal, você obtém os seguintes coeficientes em summary(m1) :

                Estimate Std. Error t value Pr(>|t|)    
(Intercept)       42.980      2.146  20.026  < 2e-16 ***
poly(speed, 2)1  145.552     15.176   9.591 1.21e-12 ***
poly(speed, 2)2   22.996     15.176   1.515    0.136    

Isso mostra que há um efeito linear altamente significativo, enquanto a segunda ordem não é significativa. O último valor p (ou seja, o de maior ordem no polinômio) é o mesmo da codificação bruta:

                            Estimate Std. Error t value Pr(>|t|)
(Intercept)                  2.47014   14.81716   0.167    0.868
poly(speed, 2, raw = TRUE)1  0.91329    2.03422   0.449    0.656
poly(speed, 2, raw = TRUE)2  0.09996    0.06597   1.515    0.136

mas os valores p de ordem inferior mudam drasticamente. A razão é que, no modelo m1 os regressores são ortogonais enquanto estão altamente correlacionados em m2 :

cor(model.matrix(m1)[, 2], model.matrix(m1)[, 3])
## [1] 4.686464e-17
cor(model.matrix(m2)[, 2], model.matrix(m2)[, 3])
## [1] 0.9794765

Assim, na codificação bruta, você só pode interpretar o valor p da speed se a speed^2 permanecer no modelo. E como os dois regressores estão altamente correlacionados, um deles pode ser descartado. No entanto, na codificação ortogonal, a speed^2 captura apenas a parte quadrática que não foi capturada pelo termo linear. E então fica claro que a parte linear é significativa enquanto a parte quadrática não tem significado adicional.




r  

r