Подгонка полиномиальной модели к данным в R
Я читал ответы на этот вопрос и они очень полезны, но мне нужна помощь, особенно в 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 помочь мне найти лучшую подходящую модель?
4 ответов:
чтобы получить полином третьего порядка в x (x^3), Вы можете сделать
lm(y ~ x + I(x^2) + I(x^3))или
lm(y ~ poly(x, 3, raw=TRUE))вы могли бы соответствовать многочлену 10-го порядка и получить почти идеальную подгонку, но должны ли вы?
изменить: Поли (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()функция, потому что мне не ясно, как я буду интерпретировать нецелочисленный многочлен.для тестирования произвольного набора математических уравнений, рассмотрим!--26--> 'Eureqa' обзор программы Андрея Гельмана здесь
обновление
смотрите также
stepAICфункция (в массовом пакете) для автоматизации выбора модели.
самый простой способ найти оптимальный вариант в R-это код модели:
lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...)после использования шаг вниз AIC регрессии
lm.s <- step(lm.1)
Comments