Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Trampas en los modelos no lineales de adaptación transformando a linealidad

Este ejemplo muestra errores que pueden producirse al ajustar un modelo no lineal mediante la transformación a linealidad. Imagine que hemos recopilado mediciones en dos variables, x e y, y queremos modelar y como una función de x. Supongamos que x se mide exactamente, mientras que las mediciones de y se ven afectadas por los errores aditivos, simétricos, de media cero.

x = [5.72 4.22 5.72 3.59 5.04 2.66 5.02 3.11 0.13 2.26 ...      5.39 2.57 1.20 1.82 3.23 5.46 3.15 1.84 0.21 4.29 ...      4.61 0.36 3.76 1.59 1.87 3.14 2.45 5.36 3.44 3.41]'; y = [2.66 2.91 0.94 4.28 1.76 4.08 1.11 4.33 8.94 5.25 ...      0.02 3.88 6.43 4.08 4.90 1.33 3.63 5.49 7.23 0.88 ...      3.08 8.12 1.22 4.24 6.21 5.48 4.89 2.30 4.13 2.17]'; 

Supongamos también que la teoría nos dice que estos datos deben seguir un modelo de decadencia exponencial, y = P1 * exp (P2 * x), donde P1 es positivo y P2 es negativo. Para ajustarse a este modelo, podríamos usar mínimos cuadrados no lineales.

modelFun = @(p,x) p(1)*exp(p(2)*x); 

Pero el modelo no lineal también se puede transformar en uno lineal tomando el registro en ambos lados, para obtener el registro (y) = log (P1) + P2 * x. Eso es tentador, porque podemos encajar ese modelo lineal por los mínimos cuadrados lineales ordinarios. Los coeficientes que conseguirían de un mínimo de cuadrados lineales serían log (P1) y P2.

paramEstsLin = [ones(size(x)), x] \ log(y); paramEstsLin(1) = exp(paramEstsLin(1)) 
 paramEstsLin =     11.9312    -0.4462  

¿Cómo lo hicimos? Podemos superponer el ajuste en los datos para averiguarlo.

xx = linspace(min(x), max(x)); yyLin = modelFun(paramEstsLin, xx); plot(x,y,'o', xx,yyLin,'-'); xlabel('x'); ylabel('y'); legend({'Raw data','Linear fit on the log scale'},'location','NE'); 

Algo parece haber salido mal, porque el ajuste no sigue realmente la tendencia que podemos ver en los datos sin procesar. ¿Qué tipo de ajuste tendríamos si solíamos hacer menos cuadrados no lineales en su lugar?nlinfit Usaremos el ajuste anterior como un punto de partida áspero, aunque no es un gran ajuste.

paramEsts = nlinfit(x, y, modelFun, paramEstsLin) 
 paramEsts =      8.8145    -0.2885  
yy = modelFun(paramEsts,xx); plot(x,y,'o', xx,yyLin,'-', xx,yy,'-'); xlabel('x'); ylabel('y'); legend({'Raw data','Linear fit on the log scale',  ...  'Nonlinear fit on the original scale'},'location','NE'); 

El ajuste que utiliza más o menos pasa a través del centro de la dispersión del punto de datos.nlinfit Una gráfica residual muestra algo aproximadamente como una dispersión incluso sobre cero.

r = y-modelFun(paramEsts,x); plot(x,r,'+', [min(x) max(x)],[0 0],'k:'); xlabel('x'); ylabel('residuals'); 

Entonces, ¿qué salió mal con el ajuste lineal? El problema está en la transformación del registro. Si trazamos los datos y los dos se ajustan a la escala de registro, podemos ver que hay un extremo atípico.

plot(x,log(y),'o', xx,log(yyLin),'-', xx,log(yy),'-'); xlabel('x'); ylabel('log(y)'); ylim([-5,3]); legend({'Raw data', 'Linear fit on the log scale',  ...  'Nonlinear fit on the original scale'},'location','SW'); 

Esa observación no es un valor atípico en los datos originales, así que ¿qué pasó para que sea uno en la escala de registro? La transformación logaritmo es exactamente lo correcto para enderezar la línea de tendencia. Pero el registro es una transformación muy no lineal, por lo que los errores de medición simétrica en la escala original se han convertido en asimétricos en la escala de registro. Observe que los valores atípicos tenían el valor y más pequeño en la escala original--cerca de cero. La transformación logaritmo ha "extendido" ese valor más pequeño y más que sus vecinos. Hicimos el ajuste lineal en la escala de registro, por lo que se ve muy afectado por ese valor atípico.

Si la medida en ese punto fuera ligeramente diferente, los dos ajustes podrían haber sido mucho más similares. Por ejemplo,

y(11) = 1; paramEsts = nlinfit(x, y, modelFun, [10;-.3]) 
 paramEsts =      8.7618    -0.2833  
paramEstsLin = [ones(size(x)), x] \ log(y); paramEstsLin(1) = exp(paramEstsLin(1)) 
 paramEstsLin =      9.6357    -0.3394  
yy = modelFun(paramEsts,xx); yyLin = modelFun(paramEstsLin, xx); plot(x,y,'o', xx,yyLin,'-', xx,yy,'-'); xlabel('x'); ylabel('y'); legend({'Raw data', 'Linear fit on the log scale',  ...  'Nonlinear fit on the original scale'},'location','NE'); 

Aún así, los dos ajustes son diferentes. ¿Cuál es "correcto"? Para responder a eso, supongamos que en lugar de errores de medición aditivos, las mediciones de y se vieron afectadas por errores multiplicativos. Estos errores no serían simétricos, y los mínimos cuadrados en la escala original no serían apropiados. Por otro lado, la transformación de registro haría los errores simétricos en la escala de registro, y los cuadrados mínimos lineales caben en esa escala es apropiado.

Por lo tanto, el método que es "correcto" depende de las suposiciones que esté dispuesto a hacer acerca de sus datos. En la práctica, cuando el término de ruido es pequeño en relación con la tendencia, la transformación logaritmo es "localmente lineal" en el sentido de que los valores y cerca del mismo valor x no se estirarán demasiado asimétricamente. En ese caso, los dos métodos conducen esencialmente al mismo ajuste. Pero cuando el término de ruido no es pequeño, debe considerar qué suposiciones son realistas y elegir un método de ajuste apropiado.