다항식 모델을 R의 데이터에 맞추기


83

질문에 대한 답변을 읽었으며 도움이 많이되었지만 특히 R에서 도움이 필요합니다.

다음과 같이 R에 예제 데이터 세트가 있습니다.

x <- c(32,64,96,118,126,144,152.5,158)  
y <- c(99.5,104.8,108.5,100,86,64,35.3,15)

이 데이터에 모델을 맞추고 싶습니다 y = f(x). 3 차 다항식 모델이되기를 바랍니다.

R에서 어떻게 할 수 있습니까?

또한 R이 가장 적합한 모델을 찾는 데 도움을 줄 수 있습니까?

답변:


98

x (x ^ 3)에서 3 차 다항식을 얻으려면 다음을 수행 할 수 있습니다.

lm(y ~ x + I(x^2) + I(x^3))

또는

lm(y ~ poly(x, 3, raw=TRUE))

10 차 다항식을 맞출 수 있고 거의 완벽하게 맞출 수 있지만 그래야합니까?

편집 : poly (x, 3)이 아마도 더 나은 선택 일 것입니다 (아래 @hadley 참조).


6
"당신은해야합니까"라고 묻는 자리에 있습니다. 샘플 데이터에는 8 개의 포인트 만 있습니다. 여기서 자유도는 상당히 낮습니다. 물론 실제 데이터에는 더 많은 정보가 포함될 수 있습니다.
JD Long

1
답변 해 주셔서 감사합니다. R이 가장 적합한 모델을 찾는 것은 어떨까요? 이것에 대한 기능이 있습니까?
Mehper C. Palavuzlar

5
"최고의 모델"에 대한 정의에 따라 다릅니다. 가장 큰 R ^ 2 (10 차 다항식)를 제공하는 모델이 반드시 "최상의"모델은 아닙니다. 모델의 용어를 합리적으로 선택해야합니다. 많은 매개 변수를 사용하여 거의 완벽한 적합을 얻을 수 있지만 모델은 예측력이 없으며 점을 통해 최적의 선을 그리는 것 외에는 쓸모가 없습니다.
그렉

10
왜 사용하고 raw = T있습니까? 상관 관계가없는 변수를 사용하는 것이 좋습니다.
hadley

2
나는 lm(y ~ x + I(x^2) + I(x^3)). 아마도 최적은 아닐 것입니다. 같은 목적에 두 가지 수단을 제공하는 것뿐입니다.
Greg

45

어떤 모델이 "가장 적합한 모델"인지는 "최고"라는 의미에 따라 다릅니다. R에는 도움이되는 도구가 있지만 그 중에서 선택할 수있는 "최고"에 대한 정의를 제공해야합니다. 다음 예제 데이터 및 코드를 고려하십시오.

x <- 1:10
y <- x + c(-0.5,0.5)

plot(x,y, xlim=c(0,11), ylim=c(-1,12))

fit1 <- lm( y~offset(x) -1 )
fit2 <- lm( y~x )
fit3 <- lm( y~poly(x,3) )
fit4 <- lm( y~poly(x,9) )
library(splines)
fit5 <- lm( y~ns(x, 3) )
fit6 <- lm( y~ns(x, 9) )

fit7 <- lm( y ~ x + cos(x*pi) )

xx <- seq(0,11, length.out=250)
lines(xx, predict(fit1, data.frame(x=xx)), col='blue')
lines(xx, predict(fit2, data.frame(x=xx)), col='green')
lines(xx, predict(fit3, data.frame(x=xx)), col='red')
lines(xx, predict(fit4, data.frame(x=xx)), col='purple')
lines(xx, predict(fit5, data.frame(x=xx)), col='orange')
lines(xx, predict(fit6, data.frame(x=xx)), col='grey')
lines(xx, predict(fit7, data.frame(x=xx)), col='black')

어떤 모델이 가장 좋습니까? 그들 중 하나에 대해 인수를 만들 수 있습니다 (그러나 나는 보간에 보라색을 사용하고 싶지 않습니다).


15

'R이 가장 적합한 모델을 찾는 데 도움이 될 수 있습니까?'라는 질문과 관련하여 테스트 할 모델 세트를 명시 할 수 있다고 가정하면이 작업을 수행하는 함수가있을 수 있지만 이는 n-1 세트에 대한 좋은 첫 번째 접근 방법이 될 것입니다. 차수 다항식 :

polyfit <- function(i) x <- AIC(lm(y~poly(x,i)))
as.integer(optimize(polyfit,interval = c(1,length(x)-1))$minimum)

메모

  • 이 방법의 유효성이 당신의 목표에 따라 달라집니다,의 가정 optimize()AIC()및 AIC 사용하려는 것을 기준 인 경우,

  • polyfit()최소값이 하나도 없을 수 있습니다. 다음과 같이 확인하십시오.

    for (i in 2:length(x)-1) print(polyfit(i))
    
  • as.integer()정수가 아닌 다항식을 해석하는 방법이 명확하지 않기 때문에 함수를 사용했습니다 .

  • 임의의 수학 방정식 세트를 테스트하려면 여기에서 Andrew Gelman이 검토 한 'Eureqa' 프로그램을 고려 하십시오.

최신 정보

또한 stepAIC모델 선택을 자동화 하는 기능 (MASS 패키지에 있음)을 참조하십시오 .


Eurequa와 R을 어떻게 연결합니까?
adam.888 2013 년

@ adam.888 좋은 질문-답을 모르지만 별도로 게시 할 수 있습니다. 그 마지막 요점은 약간의 여담이었습니다.
David LeBauer 2013 년

참고 : AIC는 Akaike Information Criterion으로 , 다양한 의미에서 최적 인 것으로 입증 된 방식으로 모델의 더 많은 수의 매개 변수에 대해 근접한 적합을 보상하고 페널티를줍니다. en.wikipedia.org/wiki/Akaike_information_criterion
예브게니 Sergeev

5

R에서 가장 적합한 것을 찾는 가장 쉬운 방법은 모델을 다음과 같이 코딩하는 것입니다.

lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...)

스텝 다운 AIC 회귀를 사용한 후

lm.s <- step(lm.1)

5
I(x^2), 등을 사용하면 피팅을위한 적절한 직교 다항식이 제공되지 않습니다.
Brian Diggs 2012 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.