二変量グラフから因子範囲を抽出この曲線と任意の Y 値の 95% CI の交点を効率的に抽出するにはどうすればよいですか。

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 )}
)
)
);そこで、曲線とその 95%CI が +/- 1.96 と交わる Ratio 値を取得したいと思います (つまり、合計 6 つの値)。 私が考えることができる力技よりも優れた解決策はありますか。予測値と平均信頼限界の式をテーブルにダンプし、値を含む行をテーブルに追加して、いつ限界を超えるかを確認するという方法です。
高度な統計モデリングデータアクセスデータの探索と視覚化マスカスタマイゼーションRe: 二変量グラフから因子範囲を抽出する拡張する@Craige_Halesと@Mark_Baileyのコードでは、以下のようなことを実行して全体の最小値を見つけ、それを各側での後続の検索の境界として使用できます。そうすれば、初期値にそれほど依存しなくなります。また、絶対値の代わりに正方形を使用すると、角が削除されます。 ただし、実際には、プロファイラーのオプティマイザーで絶対値やその他の関数を段階的に変更して使用することでうまくいきました。
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: 二変量グラフから因子範囲を抽出する因子グリッドを調整して (赤い三角形から因子グリッドをリセット)、どちらかの制限のみを取得することができます。
Re: 二変量グラフから因子範囲を抽出する問題は、絶対値関数が適切な導関数をもたない曲線を作成することにあると思います。そのため、最小化が失敗する可能性が高くなります。 期待してた@ihこのアイデアでは、最小化を強制的に適切な近傍に維持することになりますが、おそらくそうではありません。
今はそれを理解する時間がありません。おそらく、この問題に対して abs() の標準的な代替手段があり、よりスムーズな関数が得られるようです。 (二乗するかも?そんな感じ。)
編集:あなたの結果は私の結果と一致しているため、目視検査についてコメントしました。 abs 関数は最小化するために関数内にコーナーを作成し、そのコーナー付近の傾きが minimum 関数によって使用され、答えの各辺で連続 (2 次?) 導関数が求められます。 坂道なので即座に真実の答えの両側をひっくり返すと、時々近い答えが得られるのは驚くべきことです。 ログ内のメッセージはこれが原因である可能性があると思います。
Re: 二変量グラフから因子範囲を抽出する私は開始点のアルゴリズムを必死に考え出そうとしました。たとえば、二次公式を使用して 1.96 と交差する予測曲線を計算しました。その数値を開始条件に代入したとしても、かなり予測不可能な動作が発生します。

使用方法を示してくれてありがとう。この例から多くのことを学びましたが、まだ十分に堅牢ではありません。
Re: 二変量グラフから因子範囲を抽出する@Craige_Hales 、初期値の問題を解決するには、最初に関数全体を最小化すると、その比率を最小化検索の制限として使用でき、各辺の値を確実に見つけることができます。 この問題の場合、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: 二変量グラフから因子範囲を抽出するマイナーバリエーション
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 sideローサイド
High sideHigh sideハイサイド
Re: 二変量グラフから因子範囲を抽出するこれは、プロファイラーに組み込まれているオプティマイザーを使用して行うことができます。ターゲットに一致するように応答限界を設定し、上限値と下限値を見つけるには、リセット係数グリッドを使用して、検索する値の範囲を定義します (最小値を上回るか下回るか)。
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;
また、1.96 を減算して残差を最小化するだけで、minimize 関数に送信する式を変更して同じ結果を得ることができるはずです。公差を調整した後でも、何らかの理由でわずかに異なる値が得られます (最小化したプロファイラー v 1.03 では 1.07)。
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: 二変量グラフから因子範囲を抽出するそうですね、まさにこれは極小値を見つけるのには機能しますが、そこから次の 1.96 の交差点に到達するのはまだ困難です。 値が 1.96 を超えるまでは、曲線を上る必要があります。
これを一時的に解決するために、少しずつステップを踏み、値が制限(または最大ステップ数)を超えるまで両方向に進む関数を作成しましたが、JMP には次のようなソルバー関数があると予想していました。より優れたアルゴリズム (非線形プラットフォームに組み込まれているものなど)。 今のところ、必要なものは揃っていると思いますが、もっと良い方法を常に考えています。
Re: 二変量グラフから因子範囲を抽出するそうですね、この問題の問題は、通常、目標値との交差が複数あり (左側に 1 つ、右側に 1 つ)、望ましさマキシマイザーでは 2 つのうち 1 つがランダムに得られることです。
フィットモデルで逆予測を試みましたが、二次項はサポートされていません。
Re: 二変量グラフから因子範囲を抽出するコードが少し乱雑でした。 整理してサンプルを終了しましたが、まだ間違った目標を追求している可能性があります。
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: 二変量グラフから因子範囲を抽出する別のアプローチが気になります。 予測プロファイラーと、ターゲットの応答に一致するターゲットの満足度関数を使用するとどうなるでしょうか? 次に、予測平均と平均の 95% 信頼区間推定値を選択するだけです。
本来の目的からは逸れてしまったかもしれませんが…
Re: 二変量グラフから因子範囲を抽出する@Mark_Baileyありがとう、試してみましたが、構文がわかりません。
これは私が得た限りですが、次は適切な最適化制約を与える方法を理解する必要があります。
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), {})最後の部分は機能しません。 ご協力いただきありがとうございます!
Re: 二変量グラフから因子範囲を抽出するMinimize() 関数と信頼境界の式を使用できる場合があります。 ヘルプを参照してください最適化手法。
Re: グラフから範囲を抽出する直接的な方法はわかりませんが、いくつかのアイデアを紹介します。スクリプトを作成するのに少し手間がかかるものもあれば、おそらく、小さな問題に対してこれほど高速なものはないだろうと思います。
- 二変量レポートのテーブルからパラメーターと標準誤差を取得し、適切な数式を含む列を作成することにより、これらの各行の数式をデータ テーブルに保存します。次に、プロファイラーに組み込まれているオプティマイザーを使用して、それぞれを解決します。
- ブルート フォース手法を使用して比較的少数のポイントを保存し、フィット モデルを使用して新しいカーブをそれらのポイントにフィットさせます。それから予測式を保存し、オプティマイザーで解決します。
- 予測式は直接抽出できるはずですが、CI は抽出できない可能性がある場合は、代わりに適合モデルを使用して適合します。
- ブルートフォース法を使用して、最も近い数点間を補間します。最後の 2 点間は線形補間、この問題の場合は最も近い 3 点間は 2 次補間します。