Extraer el rango de factores del gráfico bivariado¿Cómo extraigo de manera eficiente los puntos de cruce de esta curva y su IC del 95 % con un valor Y arbitrario?

dt = Open( "$sample_data/Growth.jmp" );
biv = Bivariate(
Y( :age ),
X( :ratio ),
Fit Line( {Line Color( {204, 121, 41} )}, save studentized residuals ),
SendToReport(
Dispatch(
{},
"Bivar Plot",
FrameBox,
{Grid Line Order( 3 ), Reference Line Order( 4 )}
)
)
);
biv << (Curve[1] << Save Studentized Residuals);
biv2 = Bivariate(
Y( :Studentized Residuals age ),
X( :ratio ),
Fit Polynomial( 2, {Confid Shaded Fit( 1 ), Line Color( {212, 73, 88} )} ),
SendToReport(
Dispatch(
{},
"ratio",
ScaleBox,
{Min( 0.2796875 ), Max( 1.2666259765625 ), Inc( 0.2 ), Minor Ticks( 1 )}
),
Dispatch(
{},
"Studentized Residuals age",
ScaleBox,
{Add Ref Line( 1.96, "Solid", "Black", "", 1 ),
Add Ref Line( -1.96, "Solid", "Black", "", 1 )}
)
)
);Así que me gustaría obtener los valores de Ratio donde la curva y su IC del 95 % cruzan +/- 1,96 (es decir, 6 valores en total). ¿Hay alguna solución mejor que la fuerza bruta que se me ocurra: volcar las predicciones y la fórmula del límite de confianza medio en una tabla y agregar filas con valores a la tabla para ver cuándo cruza los límites?
Modelado Estadístico AvanzadoAcceso a los datosExploración y visualización de datosLa personalización en masaRe: Extraer el rango del factor de un gráfico bivariadoAmpliando @Craige_Hales y @Mark_Bailey , podría hacer algo como lo que se muestra a continuación para encontrar el mínimo general y luego usarlo como un límite para búsquedas posteriores en cada lado, de esa manera no depende tanto del valor inicial.Además, si usa un cuadrado en lugar de un valor absoluto, se deshace de la esquina. En la práctica, he tenido buena suerte usando el valor absoluto y otras funciones con cambios de paso en el optimizador del generador de perfiles.
Names Default To Here( 1 );
// example data set
dt = Open( "$sample_data/Growth.jmp" );
// fit first-order polynomial model to response
biv = Bivariate(
Y( :age ),
X( :ratio ),
Fit Line
);
// save residuals for next step
biv << (Curve[1] << Save Studentized Residuals);
biv << Close Window();
// fit second-order polynomial model to residuals
biv = Bivariate(
Y( :Studentized Residuals age ),
X( :ratio ),
Fit Polynomial( 2, {Confid Shaded Fit( 1 ), Line Color( {212, 73, 88} )} )
);
// save formulas for lower / upper 95% confidence bound
biv << (Curve[1] << Mean Confidence Limit Formula);
// get formulas
fUpper = Column( dt, N Cols( dt ) ) << Get Formula;
fLower = Column( dt, N Cols( dt ) - 1 ) << Get Formula;
// replace predictor name with x
fsUpper = Substitute( Name Expr( fUpper ), Expr( :ratio ), Expr( x ) );
fsLower = Substitute( Name Expr( fLower ), Expr( :ratio ), Expr( x ) );
// initialize x, could get x that predicts mean residual = 0
x = 0.5;
// find the minimum of the whole expression, one solution will fall above and one below this value
fOverallMin = Name Expr( fsLower );
Minimize( fOverallMin, { x } );
xOverallMin = x;
// find where the value cross the x axis on each side of the overall min
x = xOverallMin - 1;
fMinCrossingTarget = Insert( Expr( Power() ), Insert( Expr( add(-1.96) ), Name Expr( fsLower ) ) );
Minimize( fMinCrossingTarget, { x(-1000, xOverallMin) } );
xMinLower = x;
x = xOverallMin + 1;
Minimize( fMinCrossingTarget, { x(xOverallMin, 1000) } );
xMinUpper = x;
x = xOverallMin - 1;
fMaxCrossingTarget = Insert( Expr( Power() ), Insert( Expr( add(-1.96) ), Name Expr( fsUpper ) ) );
Minimize( fMaxCrossingTarget, { x(-1000, xOverallMin) } );
xMaxLower = x;
x = xOverallMin + 1;
Minimize( fMaxCrossingTarget, { x(xOverallMin, 1000) } );
xMaxUpper = x;
show(xOverallMin, xMinLower, xMinUpper, xMaxLower, xMaxUpper);
Re: Extraer el rango del factor de un gráfico bivariadoPuede ajustar la cuadrícula de factores (restablecer la cuadrícula de factores del triángulo rojo) para obtener solo un límite u otro.
Re: Extraer el rango del factor de un gráfico bivariadoCreo que el problema es que la función de valor absoluto crea una curva que no tiene una buena derivada, lo que hace que minimizar sea probable que falle. estaba esperando @ih la idea obligaría a minimizar para permanecer en el vecindario correcto, pero tal vez no.
No tengo tiempo para descifrarlo ahora mismo; parece probable que haya una alternativa estándar a abs() para este problema... produciendo una función más fluida. (¿quizás cuadrarlo? algo así).
Editar: y su resultado concuerda con el mío, razón por la cual hice el comentario sobre la inspección visual. La función abs hace una esquina en la función para minimizar, y la pendiente cerca de esa esquina es utilizada por la función de minimizar, y espera una derivada continua (¿segunda?) en cada lado de la respuesta. Desde la pendiente instantáneamente cambia a cada lado de la respuesta verdadera, es sorprendente que a veces obtenga respuestas cercanas. Creo que el mensaje en el registro puede deberse a esto.
Re: Extraer el rango del factor de un gráfico bivariadoTraté desesperadamente de encontrar un algoritmo para el punto de partida, por ejemplo, usé la fórmula cuadrática para calcular el cruce de la curva predicha con 1.96 e incluso si conecta ese número para la condición de inicio, obtiene un comportamiento bastante impredecible:

Así que gracias por mostrar cómo se puede usar y aprendí mucho de este ejemplo, pero aún no es lo suficientemente sólido.
Re: Extraer el rango del factor de un gráfico bivariado@Craige_Hales , para resolver el problema del valor inicial, si primero minimizas toda la función, podrías usar esa relación como un límite para la búsqueda de minimización y estar seguro de encontrar los valores en cada lado. Para este problema que podría ser 0.8:
Minimize( fa, { x([very small number],[min ratio - found from minimizing the function]) } );
//For this example -10 is arbitrary (could use -1E6 or something), and 0.8 is
//roughly the overall function minimum
Minimize( fa, { x(-10,0.8) } );
Re: Extraer el rango del factor de un gráfico bivariadovariación menor
offset = 1.96;
// (I do not know how to pick these without a visual examination of the result.)
startingPoint = 1.1; // or 0.5 (trial and error. pick something close and check.)
// example data set
dt = Open( "$sample_data/Growth.jmp" );
// fit first-order polynomial model to response
biv = Bivariate( Y( :age ), X( :ratio ), Fit Line );
// save residuals for next step
biv << (Curve[1] << Save Studentized Residuals);
biv << Close Window();
// fit second-order polynomial model to residuals
biv = Bivariate( Y( :Studentized Residuals age ), X( :ratio ), Fit Polynomial( 2, {Confid Shaded Fit( 1 ), Line Color( {212, 73, 88} )} ) );
// save formulas for lower / upper 95% confidence bound
biv << (Curve[1] << save predicteds);
biv << (Curve[1] << Mean Confidence Limit Formula);
// get formulas, using order columns were saved
fupper = Column( dt, N Cols( dt ) ) << Get Formula;
flower = Column( dt, N Cols( dt ) - 1 ) << Get Formula;
fpredicted = Column( dt, N Cols( dt ) - 2 ) << Get Formula;
// replace predictor name with x
fsupper = Substitute( Name Expr( fupper ), Expr( :ratio ), Expr( x ) );
fslower = Substitute( Name Expr( flower ), Expr( :ratio ), Expr( x ) );
fspredicted = Substitute( Name Expr( fpredicted ), Expr( :ratio ), Expr( x ) );
fsupper2 = Substitute( Expr( a - offset ), Expr( a ), Name Expr( fsupper ) ); // find zero at offset
fslower2 = Substitute( Expr( a - offset ), Expr( a ), Name Expr( fslower ) ); // find zero at offset
fspredicted2 = Substitute( Expr( a - offset ), Expr( a ), Name Expr( fspredicted ) ); // find zero at offset
// initialize x, could get x that predicts mean residual = 0
x = startingPoint;
// minimize expression that is Abs( residual ), or mean = 0
faupper = Insert( Expr( Abs() ), Name Expr( fsupper2 ) );
Minimize( faupper, {x} );
xupper = x;
Show( xupper, Eval( faupper ) );
// initialize x, could get x that predicts mean residual = 0
x = startingPoint;
// minimize expression that is Abs( residual ), or mean = 0
falower = Insert( Expr( Abs() ), Name Expr( fslower2 ) );
Minimize( falower, {x} );
xlower = x;
Show( xlower, Eval( falower ) );
// initialize x, could get x that predicts mean residual = 0
x = startingPoint;
// minimize expression that is Abs( residual ), or mean = 0
fapredicted = Insert( Expr( Abs() ), Name Expr( fspredicted2 ) );
Minimize( fapredicted, {x} );
xpredicted = x;
Show( xpredicted, Eval( fapredicted ) );
// add lines on plot
Report( biv )[axisbox( 2 )] << {Add Ref Line( xpredicted, "Solid", "Black", "P", 1 ), Add Ref Line( xupper, "Solid", "Black", "U", 1 ),
Add Ref Line( xlower, "Solid", "Black", "L", 1 )};
Report( biv )[axisbox( 1 )] << {Add Ref Line( offset, "Solid", "Black", "", 1 )};
Report( biv )[framebox( 1 )] << Frame Size( 752, 513 );
Low sideLow sideLado bajo
High sideHigh side Zona alta
Re: Extraer el rango del factor de un gráfico bivariadoPuede hacer esto usando el optimizador integrado en el generador de perfiles.Establezca los límites de respuesta para que coincidan con el objetivo y luego para encontrar los valores superior e inferior, simplemente use la cuadrícula de factor de restablecimiento para definir el rango de valores para buscar, ya sea por encima o por debajo del mínimo.
Profiler(
Y( :Lower 95% Mean Studentized Residuals age ),
Profiler(
1,
Desirability Functions( 1 ),
Lower 95% Mean Studentized Residuals age <<
Response Limits(
{Lower( -0.04, 0.0183 ), Middle( 1.96, 1 ), Upper( 3.96, 0.0183 ),
Goal( "Match Target" ), Importance( 1 )}
),
Term Value( ratio( 0.8, Min( 0 ), Max( 0.8 ), Lock( 0 ), Show( 1 ) ) )
),
SendToReport(
Dispatch(
{"Prediction Profiler"},
"1",
ScaleBox,
{Min( 0 ), Max( 0.8 ), Inc( 0.2 ), Minor Ticks( 0 )}
)
)
) << Maximize Desirability;
Profiler(
Y( :Lower 95% Mean Studentized Residuals age ),
Profiler(
1,
Desirability Functions( 1 ),
Lower 95% Mean Studentized Residuals age <<
Response Limits(
{Lower( -0.04, 0.0183 ), Middle( 1.96, 1 ), Upper( 3.96, 0.0183 ),
Goal( "Match Target" ), Importance( 1 )}
),
Term Value( ratio( 1.52, Min( 0.8 ), Max( 2 ), Lock( 0 ), Show( 1 ) ) )
),
SendToReport(
Dispatch(
{"Prediction Profiler"},
"1",
ScaleBox,
{Min( 0.8 ), Max( 2 ), Inc( 0.2 ), Minor Ticks( 0 )}
)
)
) << Maximize Desirability;
También debería poder modificar la expresión que envía a la función de minimizar simplemente restando 1.96 y minimizando el residuo para obtener el mismo resultado.Por alguna razón, obtengo valores ligeramente diferentes incluso después de ajustar las tolerancias (1.07 en Profiler v 1.03 con minimizar).
fa = Insert( Expr( Abs() ), parse( "abs( " || char( Name Expr( fs ) ) || " - 1.96 )" ) );
// find lower value
x = 0.2;
Minimize( fa, { x(0.2,0.8) } );
Show( x );
// find upper value
x = 1;
Minimize( fa, { x(0.8,1.5) } );
Show( x );
Re: Extraer el rango del factor de un gráfico bivariadoSí, exactamente esto funciona para encontrar el mínimo local, pero aún así es difícil llegar al siguiente cruce con 1,96 desde allí. Todavía necesitaría subir la curva hasta que los valores excedan 1.96.
Para resolver esto temporalmente, construí una función que solo toma pequeños pasos y sale en ambas direcciones hasta que el valor excede los límites (o el número máximo de pasos), pero esperaba que hubiera una función de resolución en JMP que implementaría un algoritmo mejor (como el que está integrado en la plataforma no lineal). Supongo que por ahora tengo lo que necesito, pero siempre estoy abierto a mejores formas de hacerlo.
Re: Extraer el rango del factor de un gráfico bivariadoSí, el problema con eso es que generalmente hay múltiples cruces con el valor objetivo (uno a la izquierda y otro a la derecha) y con el maximizador de deseabilidad obtienes aleatoriamente uno de los dos.
Intenté predicciones inversas en el modelo de ajuste, pero eso no admite términos cuadráticos.
Re: Extraer el rango del factor de un gráfico bivariadoTu código estaba un poco desordenado. Lo limpié y terminé el ejemplo, aunque todavía podría estar persiguiendo el objetivo equivocado.
Names Default To Here( 1 );
// example data set
dt = Open( "$sample_data/Growth.jmp" );
// fit first-order polynomial model to response
biv = Bivariate(
Y( :age ),
X( :ratio ),
Fit Line
);
// save residuals for next step
biv << (Curve[1] << Save Studentized Residuals);
biv << Close Window();
// fit second-order polynomial model to residuals
biv = Bivariate(
Y( :Studentized Residuals age ),
X( :ratio ),
Fit Polynomial( 2, {Confid Shaded Fit( 1 ), Line Color( {212, 73, 88} )} )
);
// save formulas for lower / upper 95% confidence bound
biv << (Curve[1] << Mean Confidence Limit Formula);
// get upper formula
f = Column( dt, N Cols( dt ) ) << Get Formula;
// replace predictor name with x
fs = Substitute( Name Expr( f ), Expr( :ratio ), Expr( x ) );
// initialize x, could get x that predicts mean residual = 0
x = 0.5;
// minimize expression that is Abs( residual ), or mean = 0
fa = Insert( Expr( Abs() ), Name Expr( fs ) );
Minimize( fa, { x } );
Show( x );Re: Extraer el rango del factor de un gráfico bivariadoMe pregunto acerca de otro enfoque. ¿Qué sucede si usa el Perfilador de predicción y una función de deseabilidad de Coincidir con el objetivo con su respuesta objetivo? Luego, puede seleccionar la media pronosticada y la estimación del intervalo de confianza del 95 % de la media.
Podría haberme desviado de tu objetivo original...
Re: Extraer el rango del factor de un gráfico bivariado@Mark_Bailey gracias, intenté intentarlo pero la sintaxis no me queda clara.
Esto es todo lo que llegué, pero ahora necesito descubrir cómo alimentarlo con las restricciones de optimización correctas:
Names Default To Here( 1 );
dt = Open( "$sample_data/Growth.jmp" );
biv = Bivariate(
Y( :age ),
X( :ratio ),
Fit Line( {Line Color( {204, 121, 41} )}, save studentized residuals ),
SendToReport(
Dispatch(
{},
"Bivar Plot",
FrameBox,
{Grid Line Order( 3 ), Reference Line Order( 4 )}
)
)
);
biv << (Curve[1] << Save Studentized Residuals);
biv << close window();
biv2 = Bivariate(
Y( :Studentized Residuals age ),
X( :ratio ),
Fit Polynomial( 2, {Confid Shaded Fit( 1 ), Line Color( {212, 73, 88} )} ),
SendToReport(
Dispatch(
{},
"ratio",
ScaleBox,
{Min( 0.2796875 ), Max( 1.2666259765625 ), Inc( 0.2 ), Minor Ticks( 1 )}
),
Dispatch(
{},
"Studentized Residuals age",
ScaleBox,
{Add Ref Line( 1.96, "Solid", "Black", "", 1 ),
Add Ref Line( -1.96, "Solid", "Black", "", 1 )}
)
)
);
biv << (Curve[1] << Mean Confidence Limit Formula);
f =column(dt, n cols(dt)) << Get Formula;
fs = substitute(name expr(f), expr(:ratio), expr(x1));
/*A = [1 5];
b = [-1.96, 1.96];
minFun = Constrained Maximize(
f,
{x1( 0, 5 )},
<<LESSTHANEQ></LESSTHANEQ>
minimize(name expr(f), {})La última parte no funciona. ¡Gracias por tu ayuda!
Re: Extraer el rango del factor de un gráfico bivariadoEs posible que pueda usar la función Minimize() y la expresión para el límite de confianza. Consulte la Ayuda para métodos de optimización .
Re: Extraer rango de graficaNo conozco un método directo, pero aquí hay algunas ideas.Algunos serían un poco de trabajo para escribir y probablemente sospecho que ninguno sería mucho más rápido para pequeños problemas.
- Guarde una fórmula para cada una de esas líneas en la tabla de datos extrayendo los parámetros y los errores estándar de la tabla en el informe bivariado y luego creando una columna con la fórmula adecuada.Luego use el optimizador integrado en el generador de perfiles para resolver cada uno.
- Guarde relativamente pocos puntos usando el método de fuerza bruta y luego ajuste una nueva curva a ellos usando el modelo de ajuste, y entonces guarda la fórmula de predicción y resuelve con el optimizador.
- Ajuste usando el modelo de ajuste en su lugar donde debería poder extraer la fórmula de predicción directamente, pero tal vez no el IC.
- Use el método de fuerza bruta e interpole entre los pocos puntos más cercanos, ya sea lineal entre los dos últimos o, para este problema, cuadrático entre los tres más cercanos.