Підгонка поліноміальної моделі до даних у 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), ви можете це зробити

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

або

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

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

EDIT: полі (x, 3), мабуть, кращий вибір (див. @Hadley нижче).


6
запитання "чи потрібно". Зразкові дані мають лише 8 балів. Ступінь свободи тут досить низький. Звичайно, даних про реальне життя може бути набагато більше.
JD Long

1
Дякую за вашу відповідь. А як щодо отримання R, щоб знайти найкращу модель? Чи є для цього якісь функції?
Мепер К. Палавузлар,

5
Це залежить від вашого визначення "найкращої моделі". Модель, яка дає вам найбільший R ^ 2 (а це поліном 10-го порядку), не обов'язково є "найкращою" моделлю. Умови у вашій моделі повинні бути обґрунтовано обрані. Ви можете отримати майже ідеальну посадку з великою кількістю параметрів, але модель не матиме прогнозуючої сили і буде марною ні для чого, крім проведення найкращої лінії підгонки через точки.
Грег,

10
Чому ти використовуєш raw = T? Краще використовувати некорельовані змінні.
hadley

2
Я зробив це, щоб отримати ті самі результати, що і lm(y ~ x + I(x^2) + I(x^3)). Можливо, не оптимально, просто дати два засоби для того самого.
Грег,

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()функцію, тому що мені незрозуміло, як я трактую нецілий поліном.

  • для тестування довільного набору математичних рівнянь розглянемо програму "Eureqa", розглянуту тут Ендрю Гельманом

Оновлення

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


Як я можу встановити інтерфейс Eurequa з R?
adam.888

@ adam.888 чудове запитання - я не знаю відповіді, але ви можете опублікувати його окремо. Цей останній момент був трохи відхиленням.
Девід Лебауер,

Примітка: AIC - це інформаційний критерій Akaike , який винагороджує тісний збіг і карає більшу кількість параметрів моделі, таким чином, який, як було показано, є оптимальним у різних сенсах. en.wikipedia.org/wiki/Akaike_information_criterion
Євген Сергєєв

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)тощо не дає належним чином ортогональних поліномів для підгонки.
Брайан Діггз,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.