다항식 적합에서 계수를 해석하는 방법?


36

내가 가진 일부 데이터에 2 차 다항식 적합을 만들려고합니다. 이 적합도를 플로팅한다고 가정 해 봅시다 ggplot().

ggplot(data, aes(foo, bar)) + geom_point() + 
       geom_smooth(method="lm", formula=y~poly(x, 2))

나는 얻다:

산점도에 신뢰 구간이 포함 된 포물선 적합도

따라서 두 번째 주문 적합은 아주 잘 작동합니다. R로 계산합니다.

summary(lm(data$bar ~ poly(data$foo, 2)))

그리고 나는 얻는다 :

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 ***
# ....

이제, 내 몸에 맞는 공식은 다음과 같습니다.

bar=3.2680.122foo+1.575foo2

foobar

bar=3.2680.1223+1.57532=17.077

무엇을 제공합니까? 모델의 계수를 잘못 해석하고 있습니까?


2
이 질문은 우리 사이트에서 직교 다항식
whuber

6
@whuber 문제가 "직교 다항식"이라는 것을 알고 있었다면 아마도 답을 찾았을 것입니다. 그러나 무엇을 검색해야할지 모른다면 조금 어렵습니다.
user13907

2
코드에서 두드러지게 나타나는 poly 를 검색하여 답변을 찾을 수도 있습니다 . (1) 링크는 나뿐만 아니라 미래의 독자에게 도움이 될 수 있으며 (2) 우리의 (일부 특이한) 검색 시스템을 이용하는 방법을 보여줄 수 있습니다.
whuber

7
R poly을 입력하지 않고 사용과 관련된 질문을 ?poly먼저 게시 했습니까? 그것은 큰 친근한 편지에서 맨 위에 ' 컴퓨팅 직교 다항식 ' 이라고 말합니다 .
Glen_b

4
그래 @Glen_b, 음, 나는 입력 ?poly구문을 이해하기를. 분명히, 나는 그 배후의 개념에 대한 지식이 거의 없습니다. 나는 뭔가 다른 (또는 "정상"다항식과 직교 다항식 사이에 그렇게 큰 차이), 그리고 온라인으로 모든 중고 톱 예제 있다는 것을 몰랐다 poly()특히와 피팅을 위해, ggplot왜 - 않을 것이다 나는 단지를 사용하고 결과가 "틀렸다"면 혼란 스러울까요? 저는 수학에 능숙하지 않습니다. 다른 사람들이 본 것을 적용하고 이해하려고합니다.
user13907

답변:


55

내 자세한 답변은 아래에 있지만 이런 종류의 질문에 대한 일반적인 (즉, 실제) 답변은 다음과 같습니다. 1) 실험, 주변을 둘러보고, 데이터를보고, 수행하는 작업에 관계없이 컴퓨터를 깰 수 없습니다. . . 실험; 또는 2) RTFM .

여기에 몇 가지 있습니다 R더 많거나 적은,이 질문에서 확인 된 문제를 복제 코드 :

# This program written in response to a Cross Validated question
# http://stats.stackexchange.com/questions/95939/
# 
# It is an exploration of why the result from lm(y_x+I(x^2))
# looks so different from the result from lm(y~poly(x,2))

library(ggplot2)


epsilon <- 0.25*rnorm(100)
x       <- seq(from=1, to=5, length.out=100)
y       <- 4 - 0.6*x + 0.1*x^2 + epsilon

# Minimum is at x=3, the expected y value there is
4 - 0.6*3 + 0.1*3^2

ggplot(data=NULL,aes(x, y)) + geom_point() + 
       geom_smooth(method = "lm", formula = y ~ poly(x, 2))

summary(lm(y~x+I(x^2)))       # Looks right
summary(lm(y ~ poly(x, 2)))   # Looks like garbage

# What happened?
# What do x and x^2 look like:
head(cbind(x,x^2))

#What does poly(x,2) look like:
head(poly(x,2))

첫 번째 lm는 예상 답변을 반환합니다.

Call:
lm(formula = y ~ x + I(x^2))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53815 -0.13465 -0.01262  0.15369  0.61645 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.92734    0.15376  25.542  < 2e-16 ***
x           -0.53929    0.11221  -4.806 5.62e-06 ***
I(x^2)       0.09029    0.01843   4.900 3.84e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared:  0.1985,    Adjusted R-squared:  0.182 
F-statistic: 12.01 on 2 and 97 DF,  p-value: 2.181e-05

두 번째 lm는 이상한 것을 반환합니다.

Call:
lm(formula = y ~ poly(x, 2))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53815 -0.13465 -0.01262  0.15369  0.61645 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.24489    0.02241 144.765  < 2e-16 ***
poly(x, 2)1  0.02853    0.22415   0.127    0.899    
poly(x, 2)2  1.09835    0.22415   4.900 3.84e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared:  0.1985,    Adjusted R-squared:  0.182 
F-statistic: 12.01 on 2 and 97 DF,  p-value: 2.181e-05

lm두 호출에서 동일 하기 때문에 인수 lm가 달라야합니다. 자, 논쟁을 보자. 분명히 y동일합니다. 다른 부분입니다. 의 첫 번째 호출에서 오른쪽 변수에 대한 처음 몇 가지 관찰을 살펴 보겠습니다 lm. 의 반환은 head(cbind(x,x^2))다음과 같습니다 :

            x         
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853

이것은 예상대로입니다. 첫 번째 열은 x이고 두 번째 열은 x^2입니다. lm폴리 가있는의 두 번째 호출은 어떻습니까? 의 반환은 head(poly(x,2))다음과 같습니다 :

              1         2
[1,] -0.1714816 0.2169976
[2,] -0.1680173 0.2038462
[3,] -0.1645531 0.1909632
[4,] -0.1610888 0.1783486
[5,] -0.1576245 0.1660025
[6,] -0.1541602 0.1539247

네, 정말 다릅니다. 첫 번째 열은 아니고 x두 번째 열은 그렇지 않습니다 x^2. 그래서, 어떤 poly(x,2)않습니다, 그것은 반환하지 않습니다 xx^2. 우리가 무엇을 알고 싶다면 poly도움말 파일을 읽는 것으로 시작할 수 있습니다. 그래서 우리는 말합니다 help(poly). 설명은 다음과 같습니다.

지정된 점 집합 x에 대해 차수 1에서 차수의 직교 다항식을 반환하거나 평가합니다. 이것들은 모두 0 도의 상수 다항식에 직교합니다. 또는 원시 다항식을 평가하십시오.

지금, 당신은 "직교 다항식"이 무엇인지 안다. 그렇지 않은 경우 Wikipedia 또는 Bing 을 사용하십시오 (물론 Google은 애플만큼 나쁘지 않지만 여전히 나쁘기 때문에 Google이 아닙니다). 또는 직교 다항식이 무엇인지 상관하지 않을 수도 있습니다. "원시 다항식"이라는 문구가 표시 될 수 있으며 도움말 파일에서 기본적으로 poly옵션 raw과 같은 옵션 이 조금 더 FALSE있습니다. 이 두 가지 고려 사항은 다음 중 head(poly(x, 2, raw=TRUE))어떤 수익 을 시도하도록 고무시킬 수 있습니다 .

            1        2
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853

이 발견에 흥분하여 (지금 당장 그렇습니까?) 시도해 볼 수 있습니다 summary(lm(y ~ poly(x, 2, raw=TRUE))) .

Call:
lm(formula = y ~ poly(x, 2, raw = TRUE))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.53815 -0.13465 -0.01262  0.15369  0.61645 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)              3.92734    0.15376  25.542  < 2e-16 ***
poly(x, 2, raw = TRUE)1 -0.53929    0.11221  -4.806 5.62e-06 ***
poly(x, 2, raw = TRUE)2  0.09029    0.01843   4.900 3.84e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared:  0.1985,    Adjusted R-squared:  0.182 
F-statistic: 12.01 on 2 and 97 DF,  p-value: 2.181e-05

위의 답변에는 두 가지 수준이 있습니다. 먼저, 나는 당신의 질문에 대답했습니다. 둘째, 훨씬 더 중요한 것은 여러분이 이와 같은 질문에 어떻게 대답해야하는지 설명했습니다. "프로그래밍 방법을 알고있는"모든 사람은 6 천만 번 이상의 순서를 거쳤습니다. 이 순서를 항상 거치면서 프로그래밍에 우울한 사람들조차도. 코드가 작동하지 않는 것은 정상입니다. 기능이 무엇인지 오해하는 것은 정상입니다. 이를 처리하는 방법은 주변을 둘러보고 실험하고 데이터를보고 RTFM을 보는 것입니다. "무시한 레시피 따르기"모드에서 "탐지"모드로 전환하십시오.


7
나는 이것에 +6의 가치가 있다고 생각한다. 그것이 가능 해지면 며칠 안에 기억하려고 노력할 것입니다. FTR, 나는 그것이 냉소적 일 필요는 없다고 생각하지만, 직교 다항식이 무엇인지 / 어떻게 작동하는지, 그리고 그런 것들을 알아내는 데 사용하는 과정을 보여주는 좋은 일을합니다.
gung-Monica Monica 복원

13
좋은 답변, 감사합니다. 비록 "RTFM"에 약간의 불쾌감을 주지만 (그러나 어쩌면 저일뿐입니다), 문제는 적어도 R에서 선형 회귀를하는 것과 관련하여 내가 읽은 모든 것에서 사람들은 때때로 이것을하고 다른 사람들은 그렇게한다는 것입니다. 솔직히 나는 직교 다항식에 대한 Wikipedia 항목을 이해하지 못합니다. 당신이 얻는 계수가 "잘못된"경우 회귀에 이것을 사용하는 이유는 나에게 발생하지 않습니다. 저는 수학자가 아닙니다. 저는 익히지 않은 요리사가 아니기 때문에 조리법을 따르려고하지만 그럼에도 불구하고 무언가를 먹어야합니다.
user13907

12
@ user13907, 그것은 당신 만이 아닙니다. 이것은 실제로 투표권이있는 좋은 답변이지만, 더 좋은 톤을 갖는 것이 좋습니다.
Waldir Leoncio

8
여기에 직교 다항식이 무엇인지 이해할 필요가 없습니다. 원하는 것이 아니라는 것을 이해하면됩니다. 누군가가 직교 다항식을 원하는 이유는 무엇입니까? cov (poly (x, 2))를 제출하여 다항식의 두 항 사이의 공분산이 0 (반올림 오차까지)임을 확인합니다. 이것은 직교 다항식의 주요 속성입니다. 용어는 서로 공분산이 없습니다. 때로는 RHS 변수가 서로 상관 관계가없는 것이 편리합니다. 그들의 계수는 잘못이 아니며 실제로는 다르게 해석되어야합니다.
Bill

2
아, 좋아, 일반 영어 설명은 이제 의미가 있습니다. 감사합니다.
user13907

5

Stimson et al. 의 다항식 회귀 분석에 대한 흥미로운 접근법이 있습니다 . (1978) . 재 작성이 필요합니다

Y=β0+β1X+β2X2+u

같이

Y=m+β2(fX)2+u

m=β0β12/4β2β2f=β1/2β2


2
+1 관련 분석에 대해서는 stats.stackexchange.com/questions/28730stats.stackexchange.com/questions/157629 를 참조하십시오 .
whuber

4

너무 많은 판단없이 올바른 방향으로 너지를 원한다면 : poly()와는 달리 직교 (상관되지 않은) 다항식을 I()생성하여 결과 다항식 간의 상관 관계를 완전히 무시합니다. 예측 변수 사이의 상관 관계는 선형 모델에서 문제가 될 수 있습니다 ( 상관 관계가 왜 문제가 될 수 있는지에 대한 자세한 내용 은 여기 참조 ) . poly()대신에 (일반적으로) 사용하는 것이 좋습니다 I(). 왜 결과가 그렇게 다르게 보입니까? 음, 모두 poly()I()X를 가지고의 경우 (새로운 X로 변환 I(), 새로운 X는의 경우, 단지 X ^ 1 또는 X ^ 2 poly()당신이 알고 싶은 경우 (새로운 X 년대가 훨씬 더 복잡 그들이 어디에서 왔으며 (아마도 그렇지 않을 수도 있습니다) 시작할 수 있습니다여기 또는 위에서 언급 한 Wikipedia 페이지 또는 교과서). 요점은 특정 x 값 집합을 기반으로 y를 계산 (예측) 할 때 poly()또는 I()선형 모델에있는 값에 따라 변환 된 x 값을 사용해야한다는 것 입니다. 그래서:

library(ggplot2)    

set.seed(3)
epsilon <- 0.25*rnorm(100)
x       <- seq(from=1, to=5, length.out=100)
y       <- 4 - 0.6*x + 0.1*x^2 + epsilon

# Minimum is at x=3, the expected y value there is
4 - 0.6*3 + 0.1*3^2

ggplot(data=NULL,aes(x, y)) + geom_point() + 
   geom_smooth(method = "lm", formula = y ~ poly(x, 2))

modI <- lm(y~x+I(x^2)) 
summary(modI) # Looks right
modp <- lm(y ~ poly(x, 2))
summary(modp)  # Looks like garbage

# predict y using modI
coef(modI)[1] + coef(modI)[2] * 3^1 + coef(modI)[3] * 3^2

# predict y using modp
# calculate the new x values using predict.poly()
x_poly <- stats:::predict.poly(object = poly(x,2), newdata = 3)
coef(modp)[1] + coef(modp)[2] * x_poly[1] + coef(modp)[3] * x_poly[2]

이 경우 두 모델 모두 같은 답을 반환하므로 예측 변수 간의 상관이 결과에 영향을 미치지 않음을 나타냅니다. 상관 관계가 문제인 경우 두 방법은 서로 다른 값을 예측합니다.


1

'poly'는 다항식 1, x, x ^ 2, ..., x ^ deg에서 Graham-Schmidt 직교 정규화를 수행합니다. 예를 들어이 함수는 물론 'coef'속성을 반환하지 않고 'poly'와 동일한 기능을 수행합니다.

MyPoly <- 
function(x, deg)
{
    n <- length(x)
    ans <- NULL
    for(k in 1:deg)
    {
        v <- x^k
        cmps <- rep(0, n)
        if(k>0) for(j in 0:(k-1)) cmps <- cmps + c(v%*%ans[,j+1])*ans[,j+1]
        p <- v - cmps
        p <- p/sum(p^2)^0.5
        ans <- cbind(ans, p)
    }
    ans[,-1]
}

기능적 형태에 관심이 있었기 때문에이 스레드에 착륙했습니다. 그렇다면 'poly'의 결과를 표현으로 어떻게 표현할 수 있습니까? Graham-Schmidt 절차를 반대로하십시오. 당신은 엉망으로 끝날 것입니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.