Sí, los polinomios también son problemáticos en la interpolación, debido al sobreajuste y a la alta variabilidad.
He aquí un ejemplo. Supongamos que su variable dependiente $y$ se distribuye uniformemente en el intervalo $[0,1]$ . También tienes una variable "predictora" $x$ también uniformemente distribuido en el intervalo $[0,1]$ . Sin embargo, existe no relación entre ambos. Así pues, cualquier regresión de $y$ en cualquier poder de $x$ será un ajuste excesivo.
Ahora, supongamos que extraemos 20 puntos de datos de este proceso de generación de datos y ajustamos $y\sim x^n$ para $n=1, 2, 3, 5$ . Aquí están los ajustes:
Como se ve, el ajuste se vuelve más "ondulante" para valores más altos. $n$ .
Sin embargo, un problema clave es que (por supuesto) el ajuste dependerá de los datos que hayamos muestreado aleatoriamente en nuestro proceso de generación de datos. Al fin y al cabo, podríamos haber extraído 20 pares bastante diferentes $(x,y)$ . Repitamos el ejercicio otras tres veces, con nuevas muestras aleatorias cada vez. A continuación, la fila superior es la misma que la del gráfico anterior, y las otras tres filas son sólo los ajustes basados en nuevas muestras:
El principal problema se aprecia al comparar la columna de la izquierda (ajustes lineales) y la de la derecha ( $x^5$ fits): el ajuste para un polinomio de orden inferior es mucho menos variable y dependiente de la aleatoriedad en nuestro muestreo de datos que el ajuste para el polinomio de orden superior. Si queremos interpolar $y$ para algunos $x$ incluso en algún punto intermedio del intervalo, el uso de un polinomio de orden superior producirá un ajuste mucho más inestable que el de un polinomio de orden inferior.
Código R:
nn <- 20
xx <- seq(0,1,by=.01)
png("sims_1.png",width=800,height=200)
opar <- par(mfrow=c(1,4),mai=c(.3,.3,.3,.1),las=1)
set.seed(1)
obs <- data.frame(x=runif(nn),y=runif(nn))
for ( exponent in c(1,2,3,5) ) {
model <- lm(y~poly(x,exponent),obs)
plot(obs$x,obs$y,pch=19,xlab="",ylab="",main=paste("Exponent:",exponent),xlim=c(0,1),ylim=c(0,1))
lines(xx,predict(model,newdata=data.frame(x=xx)),col="red",lwd=2)
}
dev.off()
png("sims_2.png",width=800,height=800)
opar <- par(mfrow=c(4,4),mai=c(.3,.3,.3,.1),las=1)
for ( jj in 1:4 ) {
set.seed(jj)
obs <- data.frame(x=runif(nn),y=runif(nn))
for ( exponent in c(1,2,3,5) ) {
model <- lm(y~poly(x,exponent),obs)
plot(obs$x,obs$y,pch=19,xlab="",ylab="",main=paste("Exponent:",exponent),xlim=c(0,1),ylim=c(0,1))
lines(xx,predict(model,newdata=data.frame(x=xx)),col="red",lwd=2)
}
}
par(opar)
dev.off()