Regresión segmentada<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />¿Alguien sabe cómo realizar una regresión segmentada y calcular el punto de interrupción (donde se encuentran las 2 líneas) en JMP?
Re: regresión segmentadaPara aquellos que no han visto esto, aquí hay un blog potencialmente útil escrito por mi colega. @JerryFish sobre cómo construir y manipular el ajuste por partes en JMP (usando la plataforma no lineal): Soluciones no lineales por partes, parte 3: uso del editor de fórmulas de JMP para resolver parámetros desconocidos.
Incluyo esto aquí porque encaja muy bien con esta discusión.
Re: regresión segmentadaProbé esto recientemente, para mí tiene más sentido que la utilidad de plataforma no lineal.¿Me interesaría entender cómo el esquema de iteración converge en mi solución?Intenté elegir un valor razonable de d (el punto de corte) para mis datos, y pareció funcionar mejor cuando "bloqueé" el valor de d y volví a hacer clic en el botón "Ir" en la ventana de diálogo de la plataforma que se genera desde el Plataforma no lineal lanzada utilizando:
Nonlinear( Y( :Y ), X( :Ypred ), Newton, Finish );
porción del código.
¿Existe una manera fácil de cambiar este breve script para llamar a una tabla de datos? (¿de ingresar manualmente los valores para X e Y)?
Estoy seguro de que esta es una "Pregunta para principiantes de JSL", así que me disculpo de antemano.....
Tomé esto de una manera tonta y copié y pegué solo lo siguiente en mi tabla de datos guardada con Columnas, {X, Y, Ypred} y mis datos completos:
Parameter( {a = 5, b = 45, c = -100, d = 0.109}, a + b * :X + c * (:X - d) * (:X > d) );
Nonlinear( Y( :Y ), X( :Ypred ), Newton, Finish );¡Y así llegué al resultado de mis datos!Gracias nuevamente por esta contribución a la comunidad.
Re: regresión segmentadaGracias, ¡probaré esto!
Re: regresión segmentadaComo sugiere Dodo, la regresión por partes se puede realizar con la plataforma no lineal. A continuación se muestra un ejemplo basado en el ejemplo anterior del palo roto.
New Table( "piecewise",
Add Rows( 20 ),
New Column( "X",
Continuous,
Set Values( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] )
),
New Column( "Y",
Numeric,
Set Values( [15, 12, 27, 31, 26, 31, 42, 47, 56, 56, 47, 46, 36, 44, 38, 35, 34, 35, 25, 19] )
),
New Column( "Ypred",
Numeric,
Formula( Parameter( {a = 20, b = 1, c = -10, d = 10}, a + b * :X + c * (:X - d) * (:X > d) ) )
)
);
Nonlinear( Y( :Y ), X( :Ypred ), Newton, Finish );
Re: regresión segmentadaSi se trata de una simple relación de palo roto, podrías hacer algo como esto:
// Create a broken stick relationship with some noise;
x = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
y = [15, 12, 27, 31, 26, 31, 42, 47, 56, 56, 47, 46, 36, 44, 38, 35, 34, 35, 25, 19];
expr_FX = expr(a + b*x + c*(x-d):*(x>d));
expr_SSE = expr(sum((y-expr_FX)^2));
// Supply a set of starting values;
a = 20; b = 1; c = -10; d = 15;
print("Starting values:");
show(a, b, c, d);
sse = minimize(expr_SSE, {a, b, c, d}, << tolerance(1e-5));
print("Final estimates:");
show(a, b, c, d);
show(eval(expr_FX));
He basado lo anterior en el ejemplo de mínimos cuadrados del Manual JMP 10, Capítulo 8, sustituyendo una relación de palo roto en la expresión por el modelo exponencial del ejemplo.El punto de ruptura será el parámetro d, ya que ese es el valor de x en el que cambia la pendiente de la línea.Tenga en cuenta que cuando multiplica las dos matrices (xd) y (x>d) juntas, necesitará el producto por elementos:* a diferencia de una simple multiplicación.Probablemente también necesitará un valor inicial relativamente bueno para el punto de interrupción para que la expresión converja.En este ejemplo, toda la salida se escribe en el registro.
Presumiblemente, esto también podría configurarse en la plataforma no lineal (Analizar | Modelado | No lineal), pero aún no lo he probado porque no estoy muy familiarizado con el uso de fórmulas dentro de tablas de datos.¿Eso ayuda en algo?