計画行列の列を生成する式を作成する<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />私は JMP を使用する初心者であり、JMP コミュニティで私の質問に対する同様の回答を見つけることができません。 複数の列を持つデータ テーブルがあり、ユーザーがデータ テーブルから列を選択する必要があり、選択した列に従って計画行列が生成されるとします。 選択した列と計画行列が新しいデータ テーブルに作成されます。 しかし、これでは十分ではありません。 ユーザーが新しいデータ テーブルで選択した列の値を変更したい場合、それに応じて計画マトリックスが更新されます。 私の問題は、以下のコードで計画行列を正しく更新できないことです。
// 列を選択するためのウィンドウを作成します
// ウィンドウを作成するためのコードを一部省略
CheckAndConvert = Expr(
selectedColumns = c << Get Items;
// 入力が有効な場合、続行します
If(N 個の項目 (選択された列) > 0,
win << ウィンドウを閉じる;
A = 列 (選択された列);
s = A << GetAsMatrix; // s の選択列を抽出します
// 新しいデータ テーブル "Design Matrix" を作成します
dt = New Table("計画行列");
dt << New Column("slice", Numeric, Values(s[0, 1])); // s を新しいデータ テーブルの列 "slice" にコピーします
// 計画行列の対応する列を作成し、それらを新しいデータ テーブルに追加します
For( i=1, i<=Col Max(dt:slice), i++,
dt << New Column("X"||Char(i), Numeric,
ラストの後、
方式(
If(dt:スライス == i, 1,
0
)
)
);
);
);
);
PS: スライス列の値を変更せずにコードを実行すると正しい答えが得られますが、スライスの値を変更すると X 列を更新できません。 X 列の数はスライス列の最大値であり、異なる値で固定されていないことに注意してください。 次の図では、テスト データの列 1 と列 2 を選択する例を示します。
前もって感謝します、
プロン
Re: 計画行列の列を生成する式を作成する謝罪いたします。 あなたのリクエストをもう一度読んだところ、この場合、どの JSL 関数も役に立たないことがわかりました。 これらは、線形回帰のカテゴリ因子の効果の列を作成することを目的としています。
次のスクリプトは、因子レベルを含む行列を取得し、二次多項式の各項の列を含む行列を作成します。
Names Default to Here( 1 );
x2fx = Function( { x }, { n factors, n treat, fx, f, f1, f2 },
n factors = N Col( x );
n treat = N Row( x );
fx = J( n treat, 1, 1 );
For( f = 1, f <= n factors, f++,
fx ||= x[0,f];
);
For( f1 = 1, f1 < n factors, f1++,
For( f2 = f1+1, f2 <= n factors, f2++,
fx ||= x[0,f1] :*</img> x[0,f2];
);
);
For( f = 1, f <= n factors, f++,
fx ||= x[0,f]^2;
);
fx;
);
X = [1 10,
2 20,
3 10,
4 20,
5 15,
6 15];
D = x2fx( X );
Show( D );
独自の関数を作成することはそれほど難しくありません。
Re: 計画行列の列を生成する式を作成する[ヘルプ] > [スクリプト インデックス] を参照してください。 関数を表示するようにブラウザを変更します。 次に、関数の Matrix グループを選択します。 計画行列 (因子水準) からモデル行列 (項) を作成する関数がいくつかあります。
Re: 計画行列の列を生成する式を作成する
同じではないにしても、同様の質問があると思います。
Matlab の x2fx に似た予測変数から計画行列を作成したいと考えています。
例: 予測変数を選択して designtype (2 次交互作用) を指定し、計画表を生成します。
以下のMatlabの例を参照してください:(ただし、これをJMPで実行したい)。
例 1
以下は 2 つの予測子を変換します<FONT face="Courier New" size="3">X1</FONT>と<FONT face="Courier New" size="3">X2</FONT> (の列<FONT face="Courier New" size="3">バツ</FONT>) 項を含む完全二次モデルの計画行列に<FONT face="Courier New" size="3">絶え間ない</FONT>、<FONT face="Courier New" size="3"> X1</FONT> 、<FONT face="Courier New" size="3"> X2</FONT> 、<FONT face="Courier New" size="3"> X1.*X2</FONT> 、<FONT face="Courier New" size="3"> X1.^2</FONT> 、 と<FONT face="Courier New" size="3">X2.^2</FONT> .
X = [1 10
2 20
3 10
4 20
5 15
6 15];
D = x2fx(X,'quadratic')
D =
1 1 10 10 1 100
1 2 20 40 4 400
1 3 10 30 9 100
1 4 20 80 16 400
1 5 15 75 25 225
1 6 15 90 36 225 Re: 計画行列の列を生成する式を作成するあなたの助けに本当に感謝します。
私はすでに今日の問題の解決策を見つけました。
Re: 計画行列の列を生成する式を作成するわかりました、どうもありがとう。
したがって、足りない部分は、レポート ウィンドウで (数値) 列のセルを編集できるようにすることです。この場合、'NumberColEditBox()' を使用できます。 文字列の場合は、'StringColEditBox' を使用できます。 2 つを組み合わせることで、コードが制御するエディター ウィンドウに任意のテーブルを表示できます (ただし、行の状態と式の列をスキップする必要があると思います)。
NamesDefaultToHere ( 1 ) ;
// 数値列を使用
dt =開ける( "$SAMPLE_DATA/Big Class.JMP" ) ;
cName = "身長" ;
cVals =桁( dt 、 cName ) << getValues ;
// UI
新しい=新しい窓( 「セルを編集する」 、セブ= NumberColEditBox ( cName 、 cVals ) 、ボタンボックス( "アップデート" 、 updateCells ))) ;
// スクリプトを更新
updateCells =
式(
新しい<<ウィンドウを閉じる;
newVals =セブ<< getAsMatrix ;
dt << BeginDataUpdate ;
桁( dt 、 cName ) << setValues ( newVals ) ;
dt << EndDataUpdate ;
) ;
Re: 計画行列の列を生成する式を作成する返信ありがとうございます。 ワークフローに関するあなたの理解は、まさに私がやっていることです。
「スライスの定義」について:
このタスクを達成するためのウィンドウを既に設計しています。
「スライスの更新」について:
問題は、ユーザーが行った変更に対する自動更新にあります。 計画行列を生成できますが、ユーザーがスライス列に変更を加えた場合に計画行列を自動的に更新する方法がわかりません。 さらに、計画マトリックスを自動的に更新する方法を知っていれば、コードを少し調整することで、計画マトリックスに基づいて他の列を自動的に生成しても問題ありません。
ありがとう、
プロン
Re: 計画行列の列を生成する式を作成する詳しい説明をありがとうございました。 おそらく、私が理解していることを確認するために、別の言葉でそれをエコーバックできますか?
最初のテーブル (考えられるすべてのスライスを含む) が dt0 と呼ばれるとします。 上記の重要なステップについて考えてみます。
- ユーザーは dt0 で列 (スライス) を選択し、このスライスだけを含む新しいテーブル (これを dt1 と呼びます) と、計画行列の列 (および言及した他の派生列を含む) を作成します。 .
- ユーザーが後で dt1 のスライス列を変更し、dt1 の他の列を「自動的に」更新できるようにします。
最終的なアドインには、「スライスの定義」と「スライスの更新」という 2 つのメニュー オプションがあると思います。 上記の 1. の説明が正しければ、この「デザイン スライス」スクリプトは、既に提案したコードを微調整することで簡単に取得できます。テーブル dt1 を共有フォルダーに配置して、他のユーザーが取得できるようにすることができます。テーブルまたはその中の列に必要なメタデータ。
「Update Slice」スクリプトは、共有フォルダー内の使用可能なすべてのテーブルをユーザーに提示し、ユーザーがいずれかを選択できるようにします。 ただし、この時点では、テーブルを直接編集するのではなく、テーブルのスライス列の値を変更できるレポート ウィンドウが表示されます。 ここで、「変更」とは、既存の値を更新するか、新しい行を追加することを意味します。 ユーザーがこのレポートで [OK] をクリックして満足していることを示すと、dt1 が自動的に更新されてすべての変更が反映され、必要に応じてメタデータを更新することもできます。 もちろん、この「更新」コードは「スライスの定義」と共通です。
私が誤解していない限り、このワークフローは合理的であり、ユーザーに dt1 自体への自由なアクセスを与えるよりも優れていると思われます。
Re: 計画行列の列を生成する式を作成するJMP を使用するのはこれが初めてなので、私の問題を JMP スクリプトの言語で記述してみます。 簡単に言えば、「スライス」列が存在するデータテーブルがあり、スライス列に基づいて計画行列を生成し、計画行列に基づいて他の列も生成したいと考えています。 私がしなければならないことは、このタスクを実装する JMP アドインを開発して、他の同僚も私のアドインをコンピューター実験に使用できるようにすることです。
まず、スライス列を選択するウィンドウを作成し、スライス列と計画行列を含むデータ テーブルを生成し、式を保存します。スライス列の一部の値が後で変更された場合に計画行列を自動的に更新する. (私のプロジェクト マネージャーが要求したので、 formula を保存する必要がありますが、より良い解決策を思いついた場合、数式列を使用せずに彼を納得させることができました。)
これで、ウィンドウを作成し、スライス列と計画行列を含むデータ テーブルを生成できますが、スライス列の値を変更すると計画行列を更新できません。
スライスされた列について:
JMP の計画関数が計画行列を自動的に生成できることは知っていますが、数式列が必要な場合は役に立ちません。 そこで、スクリプトに示すように、計画行列を生成する独自の関数を作成しました。 スライス列 a = [1, 1, 2, 3]' があるとします。 次に、計画行列は次のように生成されます。
1 0 0
1 0 0
0 1 0
0 0 1.
スライスされた列は大きく変化する可能性があるため、手動でスライス列を見て、計画行列に含まれる列の数を知ることは困難です。 また、スライスされた列の値は任意に変更できます。
計画マトリックスを作成するための重要なステップは次のとおりだと思います。
1. スライスされた列を選択し、[OK] ボタンをクリックすると、スライス列と計画マトリックスを含む新しいテーブルが生成されます。 明らかに、このステップには手動での介入が含まれます。
2. 新しいテーブルのスライス列の値を手動で変更すると、元の計画マトリックスが自動的に削除され、対応する新しい計画マトリックスが生成されます。
次に、計画マトリックスに基づいていくつかの列を生成する必要もあり、それらを生成するスクリプトも書きましたが、それらを数式列として保存する方法がわかりません。 計画行列の数式列を保存する方法を知っていれば、この問題は問題になりません。
最後に、計画マトリックスといくつかの列の作成に成功したら、それらをアドインとしてパッケージ化し、さまざまな状況でテストします。
ご提案いただきありがとうございます。 私が自分自身を理解できたら教えてください。
プロン
Re: 計画行列の列を生成する式を作成する私は確かに間違っている可能性があります (ソリューションをどの程度一般化する必要があるかによって異なります) が、数式列がこれを試みる最良の方法であるとは思えません。 ソース テーブルの 1 つの列が (一般に) 複数の列にマップされるという事実と、そのような列の数がソース列の (可変の) レベル数であるという事実が、これを困難にしています。
別の提案をする前に、あなたが想定しているワークフローをもう少し詳しく説明していただけますか? また、手動による介入が必要な手順も示します。
Re: 計画行列の列を生成する式を作成するご親切にありがとうございました。
列の値が変更された場合に計画マトリックスを更新できるように、列から計画マトリックスを生成する必要があります。 実際、選択した列に基づいて計画マトリックスを生成する式を作成し、選択した列の値が変更された場合に計画マトリックスを更新できるように、その式を保存したいと考えています。
私のコードでは、計画行列が生成されますが、選択した列の特定の値を変更すると更新された計画行列を取得できません。これは私が苦労している問題です。 私の問題について何か提案をいただければ、本当に感謝しています。
ありがとう、
プロン
Re: 計画行列の列を生成する式を作成するあなたが何を探しているのか正確にはわかりませんでした。 ただし、JMP を初めて使用する場合は、以下のコードからいくつかのアイデアが得られるかもしれません。
NamesDefaultToHere ( 1 ) ;
// テストテーブル
dt =新しいテーブル( "テスト" 、
新しい列( 「C1」 、数値、連続、方式( RandomInteger ( 1 、 5 )))) 、
新しい列( 「C2」 、数値、連続、方式( RandomInteger ( 1 、 5 )))) 、
新しい列( 「C3」 、数値、連続、方式( RandomInteger ( 1 、 5 )))) 、
AddRows ( 10 )
) ;
// UI
新しい窓( 「デザインをアップデート」 、
パネルボックス( 「デザインを表示する列を選択してください」 、
ルブ=ラインアップボックス( NCol ( 2 ) 、
クラブ= ColListBox ( dt 、全て、数値、最大アイテム数( 1 ) 、 MinItems ( 1 ) 、 clbスクリプト) )
)
) ;
// clb での選択に応じてラインアップ ボックス lb を動的に更新するスクリプト
clbスクリプト=
式(
// 選択した列の値を取得
ヴァルス=桁( dt 、クラブ<< getSelected ) << getAsMatrix ;
// 既存のマトリックス ボックスを削除します
試す(メガバイト<<消去) ;
// マトリックス ボックスで計画マトリックスを取得します
メガバイト=マトリックスボックス(デザイン(ヴァルス))) ;
// 新しいマトリックス ボックスを追加します
ルブ<<追加(メガバイト) ;
) ;