Estou tentando criar um ajuste polinomial de segunda ordem para alguns dados que tenho. Digamos que eu plotei este ajuste com ggplot()
:
ggplot(data, aes(foo, bar)) + geom_point() +
geom_smooth(method="lm", formula=y~poly(x, 2))
Eu recebo:
Portanto, um ajuste de segunda ordem funciona muito bem. Eu calculo com R:
summary(lm(data$bar ~ poly(data$foo, 2)))
E eu recebo:
lm(formula = data$bar ~ poly(data$foo, 2))
# ...
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 3.268162 0.008282 394.623 <2e-16 ***
# poly(data$foo, 2)1 -0.122391 0.096225 -1.272 0.206
# poly(data$foo, 2)2 1.575391 0.096225 16.372 <2e-16 ***
# ....
Agora, eu assumiria que a fórmula para o meu ajuste é:
Mas isso me dá os valores errados. Por exemplo, com sendo 3, eu esperaria que se tornasse algo em torno de 3,15. No entanto, inserindo na fórmula acima, recebo:
O que da? Estou interpretando incorretamente os coeficientes do modelo?
r
regression
interpretation
regression-coefficients
user13907
fonte
fonte
poly
sem digitar?poly
R primeiro? Diz " Calcular polinômios ortogonais " na parte superior em letras grandes e amigáveis.?poly
entender a sintaxe. É certo que tenho pouco conhecimento dos conceitos por trás disso. Eu não sabia que havia outra coisa (ou uma diferença tão grande entre polinômios "normais" e polinômios ortogonais), e os exemplos que vi on-line eram usadospoly()
para adaptação, especialmente comggplot
- então por que não usaria isso e ficar confuso se o resultado foi "errado"? Veja bem, eu não sou habilidoso em matemática - estou apenas aplicando o que vi outros fazerem e tentando entendê-lo.Respostas:
Minha resposta detalhada está abaixo, mas a resposta geral (ou seja, real) a esse tipo de pergunta é: 1) experimente, dê uma olhada, veja os dados, você não pode quebrar o computador, não importa o que faça. . . experimentar; ou 2) RTFM .
Aqui está um
R
código que replica o problema identificado nesta pergunta, mais ou menos:O primeiro
lm
retorna a resposta esperada:O segundo
lm
retorna algo estranho:Como
lm
é o mesmo nas duas chamadas, os argumentoslm
são diferentes. Então, vamos olhar para os argumentos. Obviamente,y
é o mesmo. São as outras partes. Vejamos as primeiras observações sobre as variáveis do lado direito na primeira chamada delm
. O retorno dehead(cbind(x,x^2))
parece:Isto é como esperado. A primeira coluna é
x
e a segunda coluna éx^2
. Que tal a segunda chamada delm
, aquela com poli? O retorno de sehead(poly(x,2))
parece com:OK, isso é realmente diferente. A primeira coluna não é
x
e a segunda coluna nãox^2
. Então, opoly(x,2)
que quer que faça, ele não retornax
ex^2
. Se quisermos saber o quepoly
faz, podemos começar lendo seu arquivo de ajuda. É o que dizemoshelp(poly)
. A descrição diz:Agora, você sabe o que são "polinômios ortogonais" ou não. Caso contrário, use a Wikipedia ou o Bing (não o Google, é claro, porque o Google é ruim - não tão ruim quanto a Apple, naturalmente, mas ainda ruim). Ou então, você pode decidir que não se importa com o que são polinômios ortogonais. Você pode notar a frase "polinômios brutos" e um pouco mais abaixo no arquivo de ajuda que
poly
possui uma opçãoraw
que é, por padrão, igual aFALSE
. Essas duas considerações podem inspirá-lo a experimentarhead(poly(x, 2, raw=TRUE))
quais retornos:Animado com essa descoberta (parece certo, agora, sim?), Você pode tentar:
summary(lm(y ~ poly(x, 2, raw=TRUE)))
Isso retorna:Existem pelo menos dois níveis na resposta acima. Primeiro, eu respondi sua pergunta. Segundo, e muito mais importante, ilustrei como você deve responder a perguntas como essa. Toda pessoa que "sabe programar" passou por uma sequência como a acima de sessenta milhões de vezes. Até pessoas tão deprimente em programação quanto eu passam por essa sequência o tempo todo. É normal que o código não funcione. É normal entender mal o que as funções fazem. A maneira de lidar com isso é mexer, experimentar, examinar os dados e o RTFM. Saia do modo "sem pensar em seguir uma receita" e entre no modo "detetive".
fonte
Há uma abordagem interessante para a interpretação da regressão polinomial por Stimson et al. (1978) . Envolve reescrever
Como
fonte
Se você deseja apenas um empurrão na direção certa, sem muito julgamento:
poly()
cria polinômios ortogonais (não correlacionados), ao contrário deI()
, que ignora completamente a correlação entre os polinômios resultantes. A correlação entre variáveis preditivas pode ser um problema em modelos lineares (veja aqui para obter mais informações sobre por que a correlação pode ser problemática); portanto, provavelmente é melhor (em geral) usar empoly()
vez deI()
. Agora, por que os resultados parecem tão diferentes? Bem, ambospoly()
eI()
tomar x e convertê-lo em um novo x (no caso deI()
, o novo x é apenas x ^ 1 ou x ^ 2, no caso depoly()
, os novos x são muito mais complicado (se você quer saber de onde eles vêm (e você provavelmente não), você pode começaraqui ou na página da Wikipedia ou livro mencionado ). O ponto é que, ao calcular (prever) y com base em um conjunto específico de valores de x, você precisa usar os valores de x convertidos produzidos por umpoly()
ouI()
(dependendo de qual deles estava em seu modelo linear). Tão:Nesse caso, os dois modelos retornam a mesma resposta, o que sugere que a correlação entre variáveis preditivas não está influenciando seus resultados. Se a correlação fosse um problema, os dois métodos preveriam valores diferentes.
fonte
'poli' executa a orto-normalização de Graham-Schmidt nos polinômios 1, x, x ^ 2, ..., x ^ deg Por exemplo, essa função faz a mesma coisa que 'poli' sem retornar os atributos de 'coef', é claro.
Eu cheguei nesse tópico porque estava interessado na forma funcional. Então, como expressamos o resultado de 'poli' como uma expressão? Basta inverter o procedimento de Graham-Schmidt. Você vai acabar com uma bagunça!
fonte