式をデータテーブルに保存せずに予測式を抽出<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />一連の一般化線形モデルをデータに適合させるスクリプトを作成し、AIC などを抽出してモデルの平均化を行っています。 JMP が一般化線形モデルの設計行列のカテゴリ変数をコード化する方法 (JMP は、コーナー ポイント コーディングではなく、合計からゼロへのコーディングを使用する) のため、レポートで報告された推定係数を使用して予測をモデル平均することは困難です。 fit (カテゴリの 1 つは決して表示されないため、再作成するには広範なプログラミングを行う必要があります)。 プラットフォームからの予測式を単純に使用し、1 つの大きな式でこれらの予測にモデルの重みを適用するのが最も簡単であるように見えます。
ただし、私が見る限り、予測式を各モデルのデータ テーブルに保存する必要があります。その後、次のような方法で式を抽出し、他の場所で使用できるように保存できます。
モデルフィット<<予測式;
モデルプレド式=文字(カラム(データ、 「P(PA)フォーミュラ」 ) <<数式を取得()) ;
ここで、「P(PA) Formula」は予測された式です。 次に、モデルの予測式を (文字形式で) サマリー AIC テーブルに保存し、最終的には個々の式の加重合計であるスーパー フォーミュラを作成できます。
ただし、予測はデータ テーブル全体に対して計算され、モデルの適合ごとに列を追加および削除する必要があるため、スクリプトの速度が大幅に低下します。
それでは、最初に列をデータテーブルに保存して JMP に実際に計算を行わせることなく、モデル近似から実際の予測式を抽出する方法はあるのでしょうか?
ありがとう
カール・シュワルツ
Re: 式をデータテーブルに保存せずに予測式を抽出するJMP Pro 13.0 以降、より簡単な方法があります。最初に列をデータ テーブルに保存して JMP に実際に計算を行わせることなく、モデル フィットから実際の予測式を抽出できますか?」 これはまさに「予測式の公開」とそのバリエーションが行うことです。モデルの適合によって生成された式は、と呼ばれる新しい JMP プラットフォームに直接保存されます。フォーミュラ・デポ。 そこから、他の (互換性のある) テーブルに適用したり、展開用のスコアリング コードを (複数のプログラミング言語で) 生成したり、プロファイラーやモデル比較などの JMP プラットフォームを起動したりできます。 この最後のコマンドには、アンサンブルを作成するという最終目標を実装すると思われる Model Averaging コマンドがあります。
残念ながら、使用している一般化線形モデル プラットフォームには、Publish コマンドがまだ追加されていません。 ただし、いくつか例を挙げると、ニューラル、パーティション、標準最小二乗法など、他の多くの予測モデリング プラットフォームで利用できます。
Re: 式をデータテーブルに保存せずに予測式を抽出するはい、dt を評価するには、単に
dt;あるいは、もっと派手にしたい場合は、 eval(dt);
open 関数は、いくつかの異なる引数を受け入れることができます。 多くの場合、引数の順序は重要ではありませんが、この場合は重要です。 inset into は、ここでは使用しなかった 3 番目の引数を特定の順序で指定することを指定しない限り、関数の引数リストの最後に追加されます。
確かにこれは非常に奇妙に見えるかもしれませんが、非常に便利です。
open ステートメントを式でラップすると、引数が評価される前に引数を追加または削除できます。
insert into は本質的に「,invisible」を追加しますが、解析する必要がある文字列ではありません。
insert into は、少しひねって invis の内容を追加します。invis を挿入するだけだと、評価された invis が挿入されます。それは望ましくないので、invis を「name expr」でラップしました。name expr(invis) は「invisible」として評価され、さらに共通を区切り文字として追加します。したがって、 name eval は、式のテキストをテキストにせずに追加します。残念ながら、これを説明しようとすればするほど、悪く聞こえます。
JSL では、基本的に空の関数の式から始めて、必要なすべての部分を埋め込むことができます。
Re: 式をデータテーブルに保存せずに予測式を抽出するきちんとした...しかし、「insert into」が「invis」式を「dt」式のどこに挿入するかをどのようにして知るのか、私にはよくわかりません。 Expr は、ある種のツリーを作成する式を「解析」し、ツリーの別の葉として「invis」引数を単に「挿入」するだけだと思いますか?
JMP で引数が関数にどのように渡されるのかについては十分に理解していません。 私は R の出身で、位置または argument=value のいずれかです。JMP が Open() 関数で Invisible などを使用するのは、文字列ではないため少し奇妙に感じます)。 この関数呼び出し方法に関する良い参考資料はありますか?
私はまだこれを試していませんが、実際のデータテーブルを開くには式「dt」を評価する必要があると思います。
Re: 式をデータテーブルに保存せずに予測式を抽出するわずかに異なりますが、解析は行われていません
暴れる= 1 ;
インビス=エクスプレッション(見えない) ; //これは文字列でもリストでもないので評価されません
dt =エクスプレッション(開ける( "$SAMPLE_DATA/Big Class.jmp" ) ) ;
もし(暴れる== 1 、 私に挿入( dt 、名前の説明(インビス) ) ) ; // Name Expr を使用して、式のシンボルを評価せずに返します。
Re: 式をデータテーブルに保存せずに予測式を抽出する提案をありがとう... 私も思いつきました
// 以下の runsilent フラグはデバッグに役立ちます。 すべてを表示するには、0 に設定します。 1 黙って走ること
暴れる= 0 ;
評価(解析する( "data = Open( \!"SPPI_ Data_JMP_Revised.jmp\!""||もし(暴れる、 "、\!"見えない\!"" 、 」 」 ) || ");" )) ;
runsilent=0 の場合に機能するエクスプレスを作成するには、呼び出しに「空の」引数が含まれないようにするために、「,invisible」文字列にカンマを含める必要があることに注意してください。
カール。
Re: 式をデータテーブルに保存せずに予測式を抽出するInvisible はキーワードなのでパラメータとして設定するのは簡単ではありません。通常は IF ステートメントのみを使用します。
私のディストリビューション=関数({ dt 、コル、不可視の} 、 {デフォルトのローカル} 、
もし(不可視の、
dt <<分布(見えない、カラム(評価(コル) ) )
、
dt <<分布(カラム(評価(コル) ) )
)
) ;
dt =開ける( "$SAMPLE_DATA/Big Class.jmp" ) ;
私のディストリビューション( dt 、 "身長" 、 1 ) ;
これをパラメータとして設定したい場合は、コマンドを文字列として構築し、それを解析して実行できます。
私のディストリビューション=関数({ dt 、コル、不可視の} 、 {デフォルトのローカル} 、
もし(不可視の、
キーワード= "見えない"
、
キーワード= 「」
) ;
評価(解析する(評価インサート( 「\[
dt << 分布( ^キーワード^, 列( "^col^" ) )
]\" ))) ;
) ;
dt =開ける( "$SAMPLE_DATA/Big Class.jmp" ) ;
私のディストリビューション( dt 、 "身長" 、 1 ) ;
Re: 式をデータテーブルに保存せずに予測式を抽出するフィットからのレポートが画面に表示されることはありませんが、レポートを明示的に非表示にしたことはありません。 フィットを開始するための「非表示」オプションがあることがわかりました...
プラットフォームの起動時に非表示オプションを指定すると、時間が 45 秒から 30 秒に短縮されます。
元のデータ テーブル (予測式が連続的に保存される) が表示され、最終的な概要データ テーブル (各モデルの適合結果が連続的に追加される) も表示されます。 元のデータテーブルを非表示にしてみました。これにより、予測列を追加/削除した場合でも、処理が大幅に高速化されました(現在は 15 秒に短縮されています)。
最終結果テーブルは連続的に構築されているため、行が連続的に追加されていることがわかります。 また、それを非表示にして、時間を再び 8 秒に短縮しました。
したがって、ボトルネックは CPU 時間の影響ではなく、画面操作にあるようです。
これで、(最終的に高速化されたスクリプト上で) 修正されたタイミングは次のようになります。
56% のモデル適合率
13% がモデル レポートを生成
12% モデル レポートを閉じています (非表示でも?)
私のログを見ると、私のラインは
モデルフィット<<予測式;
欠落しているブール演算子に関する警告メッセージをトリガーしました。 に切り替えたら
モデルフィット<<予測式(1) ;
スクリプトは警告メッセージを表示せずに正常に実行されます。 ただし、JSL 構文リファレンスまたはスクリプト ガイドには、
モデルフィット<<予測式(0) ;
するでしょうか? 後者でも予測式を評価しないかどうかを確認するために、小さなスクリプトを書いてみます。
現在、「非表示」オプションをその場で設定できるようにスクリプトを変更しようとしています。 次のようなことをしたいです
ランサイレント=1;
データ << open("なんとか", if(サイレントで実行, "非表示"));
しかし、JMP は常にその時点で停止します... 私はいつも、「固定された」コードワードが必要な場合にメッセージを動的にする方法に問題を抱えています。 本の話に戻ります....
カール。
Re: 式をデータテーブルに保存せずに予測式を抽出するタイミングについては、レポートウィンドウを「非表示」にしてみましたか。 これが上記の 23% という数字に影響を与えるかどうかはちょっと気になります。
Re: 式をデータテーブルに保存せずに予測式を抽出するイアンとデイブに感謝します。 ShowProperties ツリーのどこにも予測式が見つからなかったので、列の保存アクションによって要求されるまで計算されないと思われます。
数式の評価を抑制した場合と抑制しない場合のスクリプトを試してみました。 式を抑えなければ45秒かかりました。 公式を抑えた場合は44秒かかりました。 数式の評価には、実際のモデルのフィッティング、レポートからの抽出、新しい (概要) データ テーブルへの情報の保存に比べて、かなりの時間がかかると想定していたのは間違いだったようです。
スクリプトのプロファイリングをしようとは思いつきませんでした。 これをやったばかりです。 結果は次のとおりです
モデルのフィッティングに費やされる時間の 11%
レポートの作成に費やされる時間の 13%
時間の 47% は、以下を使用して予測の各モデルに使用された列の削除に費やされました。データ << 列を削除("P(PA) 式");
次の方法を使用してレポート ウィンドウから情報を抽出した後、レポート ウィンドウを閉じるのに時間の 23% が費やされました。モデルレポート << ウィンドウを閉じる;
これは意外なことだと思いました!
カール
Re: 式をデータテーブルに保存せずに予測式を抽出するFWIW、私はデイブが正しいかもしれないと思います。 「<< Get Estimates」および「<< Get Variance Components」メッセージがありますが、これらは常に利用できるわけではありません(近似の性質によって異なります)。 特定のケースで「ShowProperties()」を使用して確認する価値があるかもしれません。
Re: 式をデータテーブルに保存せずに予測式を抽出するあなたが望むことを行う方法があるかどうかはわかりません。私が採用するアプローチは、予測式を保存する前に式の評価を抑制することです。
dt << 式 Eval(1) を抑制