Extraire la plage de facteurs du graphique bivariéComment puis-je extraire efficacement les points de croisement de cette courbe et son IC à 95 % avec une valeur Y arbitraire.

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 )}
)
)
);Je voudrais donc obtenir les valeurs de Ratio où la courbe et son IC à 95% croisent +/- 1,96 (donc 6 valeurs au total). Existe-t-il de meilleures solutions que la force brute à laquelle je peux penser : vider les prévisions et la formule de limite de confiance moyenne dans un tableau et ajouter des lignes avec des valeurs au tableau pour voir quand il franchit les limites ?
Modélisation statistique avancéeAccès aux donnéesExploration et visualisation des donnéesPersonnalisation de masseRe : Extraire la plage de facteurs d'un graphique bivariéDévelopper sur @Craige_Hales et @Mark_Bailey 's, vous pouvez faire quelque chose comme ce qui est ci-dessous pour trouver le minimum global, puis l'utiliser comme limite pour les recherches ultérieures de chaque côté, de cette façon, vous n'êtes pas aussi dépendant de la valeur initiale.De plus, si vous utilisez un carré au lieu d'une valeur absolue, supprimez le coin. En pratique, j'ai eu de la chance en utilisant la valeur absolue et d'autres fonctions avec des changements d'étape dans l'optimiseur du profileur.
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 : Extraire la plage de facteurs d'un graphique bivariéVous pouvez ajuster la grille factorielle (réinitialiser la grille factorielle à partir du triangle rouge) pour n'obtenir qu'une limite ou l'autre.
Re : Extraire la plage de facteurs d'un graphique bivariéJe pense que le problème est que la fonction de valeur absolue crée une courbe qui n'a pas de belle dérivée, ce qui rend la minimisation susceptible d'échouer. J'espérais @ih idée forcerait minimiser à rester dans le bon quartier, mais peut-être pas.
Je n'ai pas le temps d'y réfléchir pour l'instant; il semble probable qu'il existe une alternative standard à abs() pour ce problème... produisant une fonction plus fluide. (peut-être le mettre au carré? Quelque chose comme ça.)
Edit : et votre résultat est d'accord avec le mien, c'est pourquoi j'ai eu le commentaire sur l'inspection visuelle. La fonction abs fait un coin dans la fonction à minimiser, et la pente près de ce coin est utilisée par la fonction de minimisation, et elle attend une dérivée continue (2e ?) De chaque côté de la réponse. Depuis la pente immédiatement retourne de chaque côté de la vraie réponse, c'est incroyable qu'il obtienne parfois des réponses proches. Je pense que le message dans le journal peut être à cause de cela.
Re : Extraire la plage de facteurs d'un graphique bivariéJ'ai désespérément essayé de trouver un algorithme pour le point de départ, par exemple j'ai utilisé la formule quadratique pour calculer le croisement de courbe prévu avec 1,96 et même si vous branchez ce nombre pour la condition de départ, vous obtenez un comportement assez imprévisible :

Donc merci d'avoir montré comment il peut être utilisé et j'ai beaucoup appris de cet exemple, mais il n'est pas encore assez robuste.
Re : Extraire la plage de facteurs d'un graphique bivarié@Craige_Hales , pour résoudre le problème de la valeur initiale, si vous minimisez d'abord toute la fonction, vous pouvez utiliser ce rapport comme limite pour la recherche de minimisation et être assuré de trouver les valeurs de chaque côté. Pour ce problème, cela pourrait être 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 : Extraire la plage de facteurs d'un graphique bivariévariation mineure
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 sideCôté bas
High sideHigh side Côté haut
Re : Extraire la plage de facteurs d'un graphique bivariéVous pouvez le faire en utilisant l'optimiseur intégré au profileur.Définissez les limites de réponse pour correspondre à la cible, puis pour trouver les valeurs supérieures et inférieures, utilisez simplement la grille des facteurs de réinitialisation pour définir la plage de valeurs à rechercher, au-dessus ou au-dessous du minimum.
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;
Vous devriez également pouvoir modifier l'expression que vous envoyez à la fonction de réduction en soustrayant simplement 1,96 et en minimisant le résidu pour obtenir le même résultat.Pour une raison quelconque, j'obtiens des valeurs légèrement différentes même après avoir ajusté les tolérances (1.07 dans le profileur v 1.03 avec minimiser).
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 : Extraire la plage de facteurs d'un graphique bivariéOui, exactement cela fonctionne pour trouver le minimum local, mais il est toujours difficile de se rendre au prochain croisement avec 1,96 à partir de là. Vous devrez toujours remonter la courbe jusqu'à ce que les valeurs dépassent 1,96.
Pour résoudre temporairement ce problème, j'ai construit une fonction qui ne prend que de petites étapes et sort dans les deux sens jusqu'à ce que la valeur dépasse les limites (ou le nombre maximum d'étapes), mais je m'attendais à ce qu'il y ait une fonction de résolution dans JMP qui implémenterait un meilleur algorithme (comme ce qui est intégré à la plate-forme non linéaire). Je suppose que pour l'instant j'ai ce dont j'ai besoin, mais je suis toujours ouvert à de meilleures façons de le faire.
Re : Extraire la plage de facteurs d'un graphique bivariéOui, le problème avec celui-là est qu'il y a généralement plusieurs croisements avec la valeur cible (un à gauche et un à droite) et avec le maximiseur de désirabilité, vous obtenez au hasard l'un des deux.
J'ai essayé les prédictions inverses sous le modèle d'ajustement, mais cela ne prend pas en charge les termes quadratiques.
Re : Extraire la plage de facteurs d'un graphique bivariéVotre code était un peu brouillon. Je l'ai nettoyé et j'ai terminé l'exemple, même si je suis peut-être encore en train de viser le mauvais objectif.
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 : Extraire la plage de facteurs d'un graphique bivariéJe m'interroge sur une autre approche. Et si vous utilisiez le Prediction Profiler et une fonction de désirabilité Match Target avec votre réponse cible ? Ensuite, vous pouvez simplement sélectionner la moyenne prédite et l'estimation de l'intervalle de confiance à 95 % de la moyenne.
Je me suis peut-être éloigné de ton objectif initial...
Re : Extraire la plage de facteurs d'un graphique bivarié@Mark_Bailey merci, j'ai essayé d'essayer mais la syntaxe n'est pas claire pour moi.
C'est tout ce que j'ai compris, mais maintenant je dois comprendre comment l'alimenter avec les bonnes contraintes d'optimisation :
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 dernière partie ne fonctionne pas. Merci pour votre aide!
Re : Extraire la plage de facteurs d'un graphique bivariéVous pourrez peut-être utiliser la fonction Minimize() et l'expression de la limite de confiance. Voir l'aide pour méthodes d'optimisation .
Re : Extraire la plage du graphiqueJe ne connais pas de méthode directe mais voici quelques idées.Certains seraient un peu de travail à scénariser et je soupçonne probablement qu'aucun ne serait beaucoup plus rapide pour les petits problèmes.
- Enregistrez une formule pour chacune de ces lignes dans le tableau de données en extrayant les paramètres et les erreurs standard du tableau dans le rapport bivarié, puis en créant une colonne avec la formule appropriée.Utilisez ensuite l'optimiseur intégré au profileur pour résoudre chacun d'entre eux.
- Enregistrez relativement peu de points en utilisant la méthode de la force brute, puis ajustez-leur une nouvelle courbe à l'aide du modèle d'ajustement, et alors enregistrez la formule de prédiction et résolvez avec l'optimiseur.
- Ajustez en utilisant le modèle d'ajustement à la place où vous devriez pouvoir extraire directement la formule de prédiction, mais peut-être pas le CI.
- Utilisez la méthode de la force brute et interpolez entre les quelques points les plus proches, soit linéaire entre les deux derniers, soit pour ce problème quadratique entre les trois plus proches.