Я прочитал ответы на этот вопрос, и они очень полезны, но мне нужна помощь, особенно в 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 помочь мне найти наиболее подходящую модель?
r
curve-fitting
data-analysis
polynomial-math
Мехпер К. Палавузлар
источник
источник
raw = T
? Лучше использовать некоррелированные переменные.lm(y ~ x + I(x^2) + I(x^3))
. Возможно, не оптимально, просто предоставление двух средств для достижения одной цели.Какая модель является «наиболее подходящей», зависит от того, что вы подразумеваете под «наилучшей». В 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()
функцию, потому что мне непонятно, как я буду интерпретировать нецелочисленный многочлен.для проверки произвольного набора математических уравнений рассмотрим программу Eureqa, рассмотренную Эндрю Гельманом здесь
Обновить
Также см.
stepAIC
Функцию (в пакете MASS) для автоматизации выбора модели.источник
Самый простой способ найти наилучшее соответствие в R - это закодировать модель как:
lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...)
После использования понижающей регрессии AIC
источник
I(x^2)
и т.д. не дает подходящих ортогональных многочленов для подбора.