Creazione di una formula JMP per estrarre valori da una tabella di ricerca con quattro variabili categorialiCiao a tutti,
Sto sviluppando indici di idoneità all'habitat per 75 diverse specie di uccelli. Ho tabelle con la stessa struttura di quella qui descritta (e allegata come tabella dati JMP) per ciascuna specie di uccelli. Li impilerò per specie in modo che tutte le specie siano incluse nella stessa tabella. La tabella allegata è gerarchica. Il primo livello della gerarchia è la specie (attualmente ce n'è solo una, ma alla fine i dati per tutte le 75 specie saranno nella stessa tabella). Il livello successivo della gerarchia è la forma del terreno (ad esempio, valle, terrazza o cresta). Una volta determinata la forma del terreno, il livello successivo della gerarchia è il tipo di copertura del suolo (es. latifoglie, conifere, foresta mista). Una volta determinata la combinazione forma/rivestimento del suolo, il livello successivo è la classe del legname (ad es. arbusto-piantina, alberello, legname da sega ad asta, legname da sega di grandi dimensioni). Ogni combinazione a 4 vie di specie, forma del suolo, copertura del suolo e classe di legname ha un valore di idoneità all'habitat compreso tra 0 e 1. Ad esempio, i vermi mangiatori di uccelli, che come le vecchie foreste di latifoglie hanno un alto valore di idoneità all'habitat (0,8) per la combinazione di valle / latifoglia / legname da sega di grandi dimensioni. Questa stessa specie ha un valore di idoneità all'habitat inferiore (0,2) per la combinazione cresta / foresta mista / alberello. Se guardi la tabella allegata, questo avrà senso per te.
Vorrei essere in grado di creare una formula da utilizzare come proprietà di colonna che faccia riferimento a questa tabella di ricerca per trovare i valori di idoneità dell'habitat basati sulla combinazione specie/forma del terreno/copertura del suolo/legno per un determinato sito (di cui ho migliaia). Il mio primo pensiero è stato quello di farlo con una dichiarazione elaborata if then, ma ci sono 60 combinazioni di forma del suolo / copertura del suolo / età della foresta per ogni specie e 75 specie. Non so come farlo in nessun modo se non manualmente nell'editor delle formule e questo sembra pazzesco. Esiste un modo semplice e più efficiente per creare una formula di colonna che possa fare riferimento a questa tabella di ricerca per estrarre valori di idoneità basati su combinazioni univoche delle quattro colonne di dati categoriali gerarchici: specie/forma del terreno/copertura del suolo/classe di legname?
Sarei grato per qualsiasi aiuto con questo. Ho visto un post più vecchio di @brady_brady su come creare una formula per una tabella di ricerca molto più semplice, ma non riuscivo a capire come potrebbe funzionare per un set di dati gerarchico come questo. VAI, comunità JMP, VAI!!!
Tabella datiRe: Creazione di una formula JMP per estrarre valori da una tabella di ricerca con quattro variabili categorialiCi sono un paio di problemi.Non so quale versione di JMP stai utilizzando.Ho sviluppato la formula in JMP 16, che a quanto pare ha un bug.Pertanto la formula è stata modificata quando l'ho salvata in JMP 16, da quello con cui l'avevo testata.Segnalerò il bug dopo che avrò finito di risponderti.La formula corretta da usare è:
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;
Ho anche modificato questa formula nella mia ultima risposta, quindi nessuno dovrebbe avere problemi con essa.
Negli ultimi dati forniti, c'è una mancata corrispondenza con la tabella dei dati di ricerca.Hai cambiato alcune delle lettere minuscole in maiuscole.La formula originale che ho scritto non compensa questo.Nella versione corrente, ho forzato tutte le ricerche da eseguire con maiuscolo in modo che non dovrebbe più essere un problema.
Re: Creazione di una formula JMP per estrarre valori da una tabella di ricerca con quattro variabili categorialiEhi @txnelson
Entrambe le tue soluzioni hanno senso per me. Preferirei la soluzione basata sulla formula. Sono andato avanti e ho copiato la formula dalla colonna "formula derivata.." nella tabella Specie osservate che hai creato in una seconda tabella JMP in cui sto effettivamente calcolando gli indici di idoneità dell'habitat (in allegato). Quando provo ad applicare la formula ottengo il seguente errore:

Non sono sicuro di come risolverei questo problema. Ti dispiacerebbe dare un'occhiata alla "colonna di idoneità derivata dalla formula) nella tabella dei dati JMP allegata e farmi sapere dove potrei aver commesso un errore? Grazie ancora per il vostro aiuto. Casey
Re: Creazione di una formula JMP per estrarre valori da una tabella di ricerca con quattro variabili categorialiPotresti anche provare a usare Virtual Join.
Crea una colonna di collegamento (ad esempio concatena tutti e quattro i valori di raggruppamento) a entrambe le tabelle che hai:


E quindi esegui il join virtuale:
Tabella con idoneità come Link ID:

Tabella a cui vuoi tirare le cose:

Se ricordo bene, i join virtuali richiedevano di avere almeno il datatable che verrà salvato con l'ID collegamento.
Elementi essenziali per comprendere Virtual Join in JMP
Join virtuali JMP in diretta
Re: Creazione di una formula JMP per estrarre valori da una tabella di ricerca con quattro variabili categorialiEDIT: OOPS, mi è sfuggita la parte sul tuo volerlo in una tabella come proprietà di una colonna: pensavo volessi solo restituire un valore basato su qualcuno che seleziona i 4 valori in una finestra di dialogo o qualcosa del genere. Quindi, dovresti andare con qualcosa come Jim propone.
Saluti,
Brady
//////////////////
Ciao,
Ci sono molti modi per farlo... probabilmente il modo più "da manuale" prevede un array associativo con chiavi multidimensionali, ma per il tuo caso d'uso è molto più semplice fare qualcosa come il seguente:
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);
Saluti,
Brady
Re: Creazione di una formula JMP per estrarre valori da una tabella di ricerca con quattro variabili categorialiEcco due modi per gestire la tua ricerca.La prima è una formula che ho creato e applicato a una tabella di esempio con solo 3 voci.Cerca nella tabella dei dati della matrice di idoneità WEWA e inserisce il valore di idoneità.È una formula raffinata, ma non molto efficace.

Ecco la formula utilizzata per la colonna "Formula durate Idoneità"
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;
Il secondo metodo, che crea la colonna denominata "idoneità", viene creato utilizzando la piattaforma Update in JMP..Ecco lo script per la sua creazione
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
)
);
PSLa tabella di dati denominata Specie osservate inizia con solo Sepcies, Landform, Landcover e Timber Class come colonne.