Por que estou recebendo previsões diferentes para expansão polinomial manual e usando a poly
função R ?
set.seed(0)
x <- rnorm(10)
y <- runif(10)
plot(x,y,ylim=c(-0.5,1.5))
grid()
# xp is a grid variable for ploting
xp <- seq(-3,3,by=0.01)
x_exp <- data.frame(f1=x,f2=x^2)
fit <- lm(y~.-1,data=x_exp)
xp_exp <- data.frame(f1=xp,f2=xp^2)
yp <- predict(fit,xp_exp)
lines(xp,yp)
# using poly function
fit2 <- lm(y~ poly(x,degree=2) -1)
yp <- predict(fit2,data.frame(x=xp))
lines(xp,yp,col=2)
Minha tentativa:
Parece ser um problema com interceptação, quando eu encaixo o modelo com interceptação, ou seja, não
-1
no modeloformula
, as duas linhas são as mesmas. Mas por que sem a interceptação as duas linhas são diferentes?Outra "correção" é usar
raw
expansão polinomial em vez de polinomial ortogonal. Se mudarmos o código parafit2 = lm(y~ poly(x,degree=2, raw=T) -1)
, formaremos 2 linhas iguais. Mas por que?
r
regression
polynomial
Haitao Du
fonte
fonte
=
e<-
para atribuição de forma inconsistente. Eu realmente não faria isso, não é exatamente confuso, mas adiciona muito ruído visual ao seu código, sem nenhum benefício. Você deve optar por um ou outro para usar em seu código pessoal e ficar com ele.<-
menos de um aborrecimento para digitar:alt+-
.Respostas:
Como você nota corretamente, a diferença original é que, no primeiro caso, você usa os polinômios "brutos", enquanto no segundo caso, usa os polinômios ortogonais. Portanto, se a
lm
chamada posterior fosse alterada para:fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)
obteríamos os mesmos resultados entrefit
efit3
. A razão pela qual obtemos os mesmos resultados neste caso é "trivial"; nos encaixamos exatamente no mesmo modelo em que nos encaixamosfit<-lm(y~.-1,data=x_exp)
, sem surpresas.Pode-se facilmente verificar se as matrizes dos dois modelos são iguais
all.equal( model.matrix(fit), model.matrix(fit3) , check.attributes= FALSE) # TRUE
).O mais interessante é o motivo pelo qual você obterá os mesmos gráficos ao usar uma interceptação. A primeira coisa a notar é que, ao ajustar um modelo com uma interceptação
No caso
fit2
, simplesmente movemos as previsões do modelo verticalmente; a forma real da curva é a mesma.Por outro lado, incluir uma interceptação no caso de
fit
resultados não apenas em uma linha diferente em termos de posicionamento vertical, mas com uma forma totalmente diferente em geral.Podemos ver facilmente isso simplesmente anexando os seguintes ajustes no gráfico existente.
OK ... Por que os ajustes de não interceptação são diferentes, enquanto os ajustes de inclusão de interceptação são iguais? A captura está novamente na condição de ortogonalidade.
No caso da
fit_b
matriz modelo utilizada conter elementos não ortogonais, a matriz Gramcrossprod( model.matrix(fit_b) )
está longe de ser diagonal; no caso dosfit2_b
elementos são ortogonais (crossprod( model.matrix(fit2_b) )
é efetivamente diagonal).fit
fit_b
fit
fit2
fit2_b
A questão interessante é por que os
fit_b
efit2_b
são os mesmos; afinal todas as matrizes de modelofit_b
efit2_b
não são iguais no valor de face . Aqui, apenas precisamos lembrar dissofit_b
efit2_b
ter as mesmas informações.fit2_b
é apenas uma combinação linear dofit_b
modo que seus ajustes resultantes serão os mesmos. As diferenças observadas no coeficiente ajustado refletem a recombinação linear dos valores defit_b
, a fim de obtê-los ortogonais. (veja G. Grothendieck responda aqui também para exemplos diferentes.)fonte