2010-09-29 7 views
67

Я прочитал ответы на эту question и они весьма полезны, но мне нужна помощь, особенно в 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 помочь мне найти подходящую модель?

ответ

71

Чтобы получить полином третьего порядка по х (х^3), вы можете сделать

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

или

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

Вы могли бы соответствовать 10-й порядок полинома и получить почти идеальную подгонку , но не так ли?

EDIT: Поли (x, 3), вероятно, лучший выбор (см. Ниже @hadley).

+6

пятно на спрашивать «вы должны». В данных выборки всего 8 баллов. Степени свободы здесь довольно низкие. Разумеется, данные реальной жизни могут быть намного больше. –

+1

Спасибо за ваш ответ. Как насчет получения R, чтобы найти подходящую модель? Существуют ли какие-либо функции для этого? –

+4

Это зависит от вашего определения «лучшей модели». Модель, которая дает вам наибольший R^2 (который полином 10-го порядка), не обязательно является «лучшей» моделью. Условия в вашей модели должны быть разумно выбраны. Вы можете получить почти идеальную форму с множеством параметров, но модель не будет иметь прогностической способности и будет бесполезной для чего угодно, кроме как рисовать линию наилучшего соответствия через точки. – Greg

12

Что касается вопроса «может помочь мне найти наилучшую подходящую модель», возможно, есть функция для этого, предполагая, что вы можете указать набор моделей для тестирования, но это был бы хороший первый подход для набора п-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' пересмотр Эндрю Гельман here

Update

Также смотрите функцию stepAIC (в пакете MASS) для автоматизации выбор модели.

+0

Как я могу связать Eurequa с R? –

+0

@ adam.888 отличный вопрос - я не знаю ответа, но вы можете опубликовать его отдельно. Этот последний момент был немного отступлением. –

+0

Примечание: AIC является Информационным Критерием _Akaike_, который вознаграждает близкое соответствие и наказывает большее количество параметров модели, таким образом, что было показано, что оно оптимально в разных смыслах. http://en.wikipedia.org/wiki/Akaike_information_criterion –

37

Какая модель является «подходящей моделью», зависит от того, что вы подразумеваете под «лучшим». У 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') 

Какая из этих моделей самая лучшая?аргументы могут быть сделаны для любого из них (но я бы не хотел использовать фиолетовый для интерполяции).

5

Самый простой способ найти наиболее подходящий в R является код модели, как:

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

После использования шаг вниз AIC регрессии

lm.s <- step(lm.1) 
+2

Использование 'I (x^2)' и т. д. не дает подходящих ортогональных многочленов для подгонки. –