4 つのカテゴリ変数を含むルックアップ テーブルから値を取得する JMP 数式の作成こんにちは、みんな、
私は、75 種類の鳥類の生息地適合性指標を開発しています。 各鳥種について、ここで説明されている (JMP データ テーブルとして添付されている) ものと同じ構造のテーブルがあります。 すべての種が同じ表に含まれるように、種ごとにそれらを積み重ねます。 添付の表は階層的です。 階層の最初のレベルは種です (現在は 1 つだけですが、最終的には 75 種すべてのデータが同じテーブルに含まれる予定です)。 階層の次のレベルは地形です (谷、段丘、尾根など)。 地形が決定されると、階層の次のレベルは土地被覆タイプ (落葉樹、針葉樹、混交林など) になります。 地形と土地被覆の組み合わせが決定されると、次のレベルは木材クラスです (例: 低木苗木、苗木、ポールソー材、大型ソー材)。 種、地形、土地被覆、木材クラスの 4 種類の組み合わせごとに、0 から 1 の範囲の生息地適合性値があります。 たとえば、古い落葉樹林が好きなワーブラーは、谷/落葉樹/大型ノコギリ材の組み合わせで高い生息地適合値 (0.8) を持っています。 この同じ種は、尾根/混交林/苗木の組み合わせに対して、より低い生息地適合値 (0.2) を持っています。 添付の表を見ると、これは理にかなっています。
このルックアップ テーブルを参照する列プロパティとして使用できる式を作成して、特定のサイトの種 / 地形 / 土地被覆 / 木材クラスの組み合わせに基づいて生息地適合性値を見つけられるようにしたいと考えています (そのうちの数千)。 私が最初に考えたのは、精巧な if then ステートメントでこれを行うことでしたが、種ごとに 60 の地形/土地被覆/森林年齢の組み合わせと 75 の種があります。 数式エディターで手動で行う以外の方法でこれを行う方法がわかりません。これはおかしいようです。 このルックアップ テーブルを参照して、4 つの階層カテゴリ データ列 (種 / 地形 / 土地被覆 / 木材クラス) の一意の組み合わせに基づいて適合値を取得できる列式を作成する、シンプルで効率的な方法はありますか?
これについて何か助けていただければ幸いです。 からの古い投稿を見ました@ブレイディ_ブレイディはるかに単純なルックアップ テーブルの数式を作成する方法について説明しましたが、このような階層データ セットに対してどのように機能するかわかりませんでした。 GO、JMPコミュニティ、GO!!!
データ表Re: 4 つのカテゴリ変数を持つルックアップ テーブルから値を取得する JMP 数式の作成いくつかの問題があります。実行している JMP のバージョンがわかりません。明らかにバグがあるJMP 16で式を開発しました。そのため、JMP 16 に保存したときに、テストしたものから式が変更されました。返信が終わったら、バグを報告します。使用する正しい式は次のとおりです。
If( Row() == 1,
dt = Data Table( "WEWA suitability matrix with data" );
dtLookup = Data Table( "WEWA suitability matrix" );
Show( dt, dtlookup );
);
curSpec = Uppercase( dt:Species );
curLandForm = Uppercase( dt:Landform );
curLandCover = Uppercase( dt:Landcover );
curTimber = Uppercase( dt:Timber Class );
x = .;
Try(
x = dtLookup:Suitability[dtLookup << get rows where(
Uppercase( dtLookup:Species ) == curSpec & Uppercase( dtLookup:Landform ) == curLandForm & Uppercase( dtLookup:Landcover ) ==
curLandCover & Uppercase( dtLookup:Timber Class ) == curTimber
)][1],
.
);
x;
前回の返信でこの数式も編集したので、誰も問題にならないはずです。
あなたが提供した最新のデータでは、ルックアップ データ テーブルとの不一致があります。小文字の一部を大文字に変更しました。私が書いた元の式はこれを補っていません。現在のバージョンでは、すべてのルックアップを強制的に大文字で行うようにしたので、問題はなくなりました。
Re: 4 つのカテゴリ変数を持つルックアップ テーブルから値を取得する JMP 数式の作成おい@txnelson
あなたの解決策は両方とも私には理にかなっています。 私は数式駆動型のソリューションを好むでしょう。 私は先に進み、あなたが作成した観察種テーブルの「式の派生..」列から式をコピーして、実際に生息地適合性指数を計算している2番目のJMPテーブルにコピーしました(添付)。 式を適用しようとすると、次のエラーが発生します。

これをどのように修正するかわかりません。 添付のJMPデータ表の「式から導き出された適合性欄」を見て、どこに誤りがあるか教えていただけませんか? ご協力いただきありがとうございます。 ケーシー
Re: 4 つのカテゴリ変数を持つルックアップ テーブルから値を取得する JMP 数式の作成Virtual Join を使用することもできます。
両方のテーブルにリンク列を作成します (たとえば、4 つのグループ値をすべて連結します)。


次に、仮想結合を実行します。
リンク ID としての適合性を持つテーブル:

プルしたいテーブル:

私の記憶が正しければ、仮想結合では、少なくともリンク ID となるデータテーブルを保存する必要がありました。
JMP で仮想結合を理解するための要点
JMP On Air バーチャル参加
Re: 4 つのカテゴリ変数を持つルックアップ テーブルから値を取得する JMP 数式の作成編集:おっと、これを列プロパティとしてテーブルに入れたいという部分を見逃していました-ダイアログか何かで誰かが4つの値を選択することに基づいて値を返したいだけだと思いました。 したがって、ジムが提案するようなものを使用する必要があります。
乾杯、
ブレイディ
//////////////////
やあ、
これを行うには多くの方法があります...おそらく最も「教科書」的な方法は、多次元キーを持つ連想配列を含みますが、ユースケースでは、次のようなことを行う方がはるかに簡単です:
Names Default To Here( 1 );
//suppose these are the values you want to look up, and you've gotten them somehow
spec = "Worm-eating warbler";
form = "Terrace-mesic";
cover = "Mixed";
class = "sapling";
//set a variable reference to the lookup table
dt1 = Data Table( "WEWA suitability matrix.jmp" );
//add a formula column to the lookup table, concatenating these 4 values, separated by a comma for clarity
dt1 << New Column( "Concat", character, formula( Concat Items( {:species, :landform, :landcover, :timber class}, "," ) ) );
//create a matrix of the suitabilities and a list of the combo values
suits = dt1:suitability << get values;
combos = dt1:concat << get values;
//create a lookup value from your 4 values by concatenating them in the same way you did in the formula
myLookup = concatitems({spec, form, cover, class}, ",");
//grab the suitability value you want; it will have the same position in its matrix as the lookup value has in its list
s = suits[contains(combos, myLookup)];
show (s);
乾杯、
ブレイディ
Re: 4 つのカテゴリ変数を持つルックアップ テーブルから値を取得する JMP 数式の作成ルックアップを処理する 2 つの方法を次に示します。1 つ目は、3 つのエントリしかないサンプル テーブルに作成して適用した数式です。WEWA 適合性マトリックス データ テーブルを検索し、適合性値を取得します。これは優れた式ですが、あまり効率的ではありません。

「適合性を導き出す式」の列に使用した式は次のとおりです。
If( Row() == 1,
dt = Data Table( "WEWA suitability matrix with data" );
dtLookup = Data Table( "WEWA suitability matrix" );
Show( dt, dtlookup );
);
curSpec = Uppercase( dt:Species );
curLandForm = Uppercase( dt:Landform );
curLandCover = Uppercase( dt:Landcover );
curTimber = Uppercase( dt:Timber Class );
x = .;
Try(
x = dtLookup:Suitability[dtLookup << get rows where(
Uppercase( dtLookup:Species ) == curSpec & Uppercase( dtLookup:Landform ) == curLandForm & Uppercase( dtLookup:Landcover ) ==
curLandCover & Uppercase( dtLookup:Timber Class ) == curTimber
)][1],
.
);
x;
「適合性」という列を作成する 2 番目の方法は、JMP の Update プラットフォームを使用して作成されます。これを作成するためのスクリプトは次のとおりです。
names default to here(1);
Data Table( "Observed Species" ) << Update(
With( Data Table( "WEWA suitability matrix" ) ),
Match Columns(
:Species = :Species, :Landform = :Landform, :Landcover = :Landcover,
:Timber Class = :Timber Class
)
);
PSObserved Species と呼ばれるデータ テーブルは、列として Sepcies、Landform、Landcover、および Timber Class のみで始まります。