web-dev-qa-db-fra.com

Ajustement du modèle polynomial aux données de R

J'ai lu les réponses à cette question question et elles sont très utiles, mais j'ai besoin d'aide en particulier dans R.

J'ai un exemple de jeu de données dans R comme suit:

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)

Je veux adapter un modèle à ces données afin que y = f(x). Je veux que ce soit un modèle polynomial du 3ème ordre.

Comment puis-je faire cela dans R?

De plus, R peut-il m'aider à trouver le modèle le mieux adapté?

80

Pour obtenir un polynôme de troisième ordre dans x (x ^ 3), vous pouvez faire

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

ou

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

Vous pourriez adapter un polynôme du 10ème ordre et obtenir un ajustement presque parfait, mais le devriez-vous?

EDIT: poly (x, 3) est probablement un meilleur choix (voir @hadley ci-dessous).

89
Greg

Le modèle qui convient le mieux dépend de ce que vous entendez par "meilleur". R a des outils pour vous aider, mais vous devez fournir la définition de "meilleur" pour choisir entre eux. Considérons les exemples de données et le code suivants:

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')

Lequel de ces modèles est le meilleur? des arguments pourraient être avancés pour chacun d’entre eux (mais pour ma part, je ne voudrais pas utiliser le violet pour l’interpolation).

40
Greg Snow

En ce qui concerne la question "puis-je m'aider à trouver le meilleur modèle approprié", il existe probablement une fonction pour le faire, en supposant que vous puissiez définir l'ensemble des modèles à tester, mais ce serait une bonne première approche pour l'ensemble de n-1 polynômes de degré:

polyfit <- function(i) x <- AIC(lm(y~poly(x,i)))
as.integer(optimize(polyfit,interval = c(1,length(x)-1))$minimum)

Remarques

  • La validité de cette approche dépendra de vos objectifs, des hypothèses de optimize() et de AIC() et si AIC est le critère que vous souhaitez utiliser,

  • polyfit() peut ne pas avoir un minimum unique. vérifiez ceci avec quelque chose comme:

    for (i in 2:length(x)-1) print(polyfit(i))
    
  • J'ai utilisé la fonction as.integer() car je ne vois pas comment j'interpréterais un polynôme non entier.

  • pour tester un ensemble arbitraire d'équations mathématiques, considérons le programme 'Eureqa' examiné par Andrew Gelman ici

Mettre à jour

Voir également la fonction stepAIC (dans le package MASS) pour automatiser la sélection du modèle.

14
David LeBauer

Le moyen le plus simple de trouver le meilleur ajustement dans R consiste à coder le modèle comme suit:

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

Après avoir utilisé la régression AIC progressive

lm.s <- step(lm.1)
5
Matthew Fidler