이 질문에 대한 답변을 읽었으며 도움이 많이되었지만 특히 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이 가장 적합한 모델을 찾는 데 도움을 줄 수 있습니까?
답변
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 참조).
답변
어떤 모델이 “가장 적합한 모델”인지는 “최고”라는 의미에 따라 다릅니다. 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')
어떤 모델이 가장 좋습니까? 그들 중 하나에 대해 인수를 만들 수 있습니다 (그러나 나는 보간에 보라색을 사용하고 싶지 않습니다).
답변
‘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 패키지에 있음)을 참조하십시오 .
답변
R에서 가장 적합한 것을 찾는 가장 쉬운 방법은 모델을 다음과 같이 코딩하는 것입니다.
lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...)
스텝 다운 AIC 회귀를 사용한 후
lm.s <- step(lm.1)