Come identificare i minimi dei massimi nei gruppi di datiSupponiamo che io prenda tutti gli studenti della Big Class e li divida in gruppi in base al sesso e all'età, ad esempio i ragazzi di 12 anni in un gruppo, le ragazze di 12 anni in un altro, ecc.
Con questa configurazione, vorrei creare una colonna formula che abbia 1 se il gruppo ha l'altezza massima più bassa per la propria età in entrambi i sessi e 0 in caso contrario.
Ad esempio, in questi dati:
| Gruppo | Nome | Altezza | NUOVA COLONNA |
| Ragazze di 12 anni | Katia | 59 | 0 |
| | GIANNI | 55 | 0 |
| | La mia vita | 66 | 0 |
| | LILLIA | 52 | 0 |
| Ragazzi di 12 anni | Tempo | 60 | 1 |
| | GIACOMO | 61 | 1 |
| | Roberto | 51 | 1 |
L'altezza massima per le ragazze è 66 e per i ragazzi è 61, quindi il gruppo dei ragazzi ha l'altezza massima più bassa per la loro età, quindi la nuova colonna della formula conterrà 1 per Tim, James e Robert e zero per Katie, Louise, Jane, ecc.
È possibile farlo in una colonna formula?
(Posso condividere ciò che ho provato, ma sto cercando di evitare il problema xy, http://xyproblem.info qui...)
Analisi e modellazione dei dati di baseEsplorazione e visualizzazione dei datiRe: Come identificare i minimi dei massimi nei gruppi di datiÈ possibile utilizzare le aggregazioni Col ...
modifica: se qualcuno ha chiesto il genere dello studente con l'altezza più bassa per fascia d'età:
Per prima cosa, usa Col Min per trovare lo studente con l'altezza minima in base all'età.
Quindi usa Col Max per diffondere questa conoscenza tra tutti gli studenti dello stesso sesso.
COSÌ:
New Column( "myCol",
Formula( Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age ) ),
)
Come hai chiesto
una colonna formula che ha 1 se quel gruppo ha l'altezza massima più bassa per la propria età in entrambi i sessi, e 0 altrimenti
l'approccio deve essere corretto per
New Column( "myCol",
Formula(
Col Maximum(
:height == Col Min( Col Maximum( :height, :age, :sex ), :age ),
:sex,
:age
)
)
)
lungo l'idea di:
- qual è l'altezza massima per età e sesso
- prendi i valori e trova l'altezza minima (massima) per età
- which student?
[ah, no, non vogliamo uno studente a caso, vogliamo solo uno studente alto quanto la tua!]
-> replace :height with Col Maximum( :height, :age, :sex ) *) </CODE>use col max to spread the 1 to all other students with the same sex and age</STRIKE><BR /><STRIKE>imposta l'altro sesso su 0 - o 1, se ci sono un ragazzo e una ragazza con la stessa altezza.</STRIKE><BR /><FONT face="comic sans ms,sans-serif" color="#999999">questa parte non ci serve più</FONT><BR /><FONT face="comic sans ms,sans-serif" color="#999999">... e siamo arrivati esattamente alla soluzione di Jarmo (vedi sotto)</FONT><BR /><BR /></LI></UL></LINGO-BODY><LINGO-SUB id="lingo-sub-821774" slang="en-US" mode="CREATE">Re: Come identificare i minimi dei massimi nei gruppi di dati</LINGO-SUB><LINGO-BODY id="lingo-body-821774" slang="en-US" mode="CREATE"><P>Problema XY:<BR /> Grazie : )</P></LINGO-BODY><LINGO-SUB id="lingo-sub-821776" slang="en-US" mode="CREATE">Re: Come identificare i minimi dei massimi nei gruppi di dati</LINGO-SUB><LINGO-BODY id="lingo-body-821776" slang="en-US" mode="CREATE"><P>Wow, sembra funzionare, ma il mio cervello non riesce nemmeno a capire come funziona...</P><P> </P><P>Lasciami provare a spiegarlo qui e forse puoi aiutarmi a capire...</P><P> </P><P>Iniziando con: Col Maximum( :height == Col Minimum( :height, :age ), :sex, :age )</P><P> </P><P>Col Minimum( :height, :age ) --> restituisce l'altezza minima per tutti gli studenti di questa età</P><P> </P><P>:height == Col Minimum( :height, :age ) --> restituisce true/false (1/0) se la colonna altezza di questa riga corrisponde a quell'altezza minima</P><P> </P><P>Col Maximum( <1 o 0 per questa riga> , :sex, :age ) --> uh... questo non ha senso, pensavo che column maximum funzionasse raggruppando i dati in base alle colonne group-by (:sex, :age), e poi trovasse il massimo della colonna dei valori o della colonna nel primo argomento (che ora è solo un singolo vero/falso o 1/0) e poi restituisse il valore massimo corrispondente per il gruppo di questa riga, ovvero i valori di questa riga per :sex e :age.</P><P> </P><P>Ovviamente è sbagliato, cosa mi sfugge?</P><P> </P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-821779" slang="en-US" mode="CREATE">Re: Come identificare i minimi dei massimi nei gruppi di dati</LINGO-SUB><LINGO-BODY id="lingo-body-821779" slang="en-US" mode="CREATE"><P>Molti modi per farlo usando ad esempio diverse combinazioni di funzioni statistiche col (come già mostrato). Ecco un'altra opzione (penso che dovrebbe fare quello che stai cercando)</P>
<P> </P>
<PRE><CODE class=" language-jsl">Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
Innanzitutto Col Min() cerca Col Max() nei gruppi di età e sesso OLTRE l'età e lo confronta con i massimi dei gruppi di età e sesso e, se è uguale al minimo dei gruppi di età , il valore è 1.
Per comprenderli più facilmente, penso che sia utile scriverli tutti separatamente e renderli più facili da capire, in questo caso:
First column with Col Max(:height, :age, :sex) (max_height_for_agesex)
- Next column then utilizes that
Col Min(:max_height_for_agesex, :age) age_minmax_age
- And the final one is the comparison of these two
:max_height_for_agesex == :age_minmax_age
Re: Come identificare i minimi dei massimi nei gruppi di datiGrazie @jthi , anche se sono ancora confuso.
Iniziando da questo:
Col Min(Col Max(:height, :age, :sex), :age) == Col Max(:height, :age, :sex)
Quando JMP valuta "Col Max(:height, :age, :sex)", cosa restituisce? Un singolo valore? O un elenco?
Posso creare una nuova colonna con questa formula e produrre un elenco di valori che finiscono nelle righe della colonna.
Ma all'interno di una formula, sembra che restituisca un singolo valore, ad esempio:
a = col max(:height, :name);
type(a);
... restituisce "Numero".
E se creo un nuovo script e inserisco:
a = col max(:height, :name); <BR />show(a);
dice "numero di riga non valido", ma senza ", :name" funziona bene restituendo 70. Sembra che JMP stia facendo una specie di significato specifico del contesto con queste funzioni. Come funziona? È spiegato da qualche parte?
Re: Come identificare i minimi dei massimi nei gruppi di datiquando si esegue la formula di una colonna formula in una cella, viene calcolato il valore per la riga corrente.
Quando lo si esegue in JSL, il calcolo avviene per la riga corrente.
Sembra lo stesso. Ma il valore predefinito per "riga corrente" è "riga 0", ovvero nessun numero valido.
È anche possibile controllare il calcolo per qualsiasi riga, diversa dal valore predefinito "0".
Basta inserire row()=xy davanti al calcolo e il calcolo verrà eseguito per la riga xy .
quindi, ad esempio
row()=5;
col max(:height, :age)
restituirà 66.
:l'età nella riga=5 è 12 e l'altezza massima per età =12 è 66 .
Re: Come identificare i minimi dei massimi nei gruppi di datiImmagino che funzioni così:
Col ... prima esamina tutte le righe e memorizza i risultati del primo argomento.
Lo calcola riga per riga, ad esempio se il primo argomento è random uniform() .
Inoltre, memorizza una tabella di ricerca per gli argomenti aggiuntivi di raggruppamento.
Quindi suddivide i dati in sottoinsiemi, calcola i valori aggregati e quindi li distribuisce nuovamente nelle rispettive righe.
Re: Come identificare i minimi dei massimi nei gruppi di dati
Quando JMP valuta "Col Max(:height, :age, :sex)", cosa restituisce? Un singolo valore? O un elenco?
Valore singolo.
Se crei uno script e vuoi testare cosa sta succedendo, devi usare Row() SE stai usando per colonne (senza per colonne funzionerà perché JMP sa di usare tutte le righe). Row() sarà 0 per impostazione predefinita in JMP, quindi devi cambiarlo ad esempio in Row() = 1. Penso di aver visto della documentazione su questo nella Guida di JMP o nell'indice di scripting, ma non ho idea di dove (potrebbe essere correlato alle funzioni statistiche Row(), For Each Row o Col).
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
max_height = Col Max(:height); // works fine as no by var used and uses all rows
Show(Row());
Col Max(:height, :age); // won't work as JMP doesn't know which age to use -> it needs row information
Row() = 1;
cur_age = :age;
cur_maxheight = Col Max(:height, :age);
Write("\!Max height for age ", cur_age, " is ", cur_maxheight);Re: Come identificare i minimi dei massimi nei gruppi di datiSembra che tu stia dicendo che JMP sta inserendo l'intera formula della colonna in un ciclo che ripete "Row()" sulle righe della tabella, calcolando un valore per ogni riga.
Ciò *avrebbe* senso, se non fosse per questa espressione:
Col Min(Col Max(:height, :age, :sex), :age)
... che secondo questa logica, quando ad esempio Row() è impostato su i=1, allora calcolerebbe Col Max() come il valore più grande nella colonna :height dell'intera tabella dove :age[i] == :age[1] e :sex[i] == :sex[1], che restituisce un singolo numero. Quindi prova a calcolare Col Min() di quel singolo numero, che per definizione può essere solo quel numero. Sto davvero lottando per far sì che abbia senso.
Continuo a pensare che Col Max() debba restituire un elenco, quindi Col Min() potrebbe esaminare tutte le righe di quell'elenco in cui :age[i] == :age[1].
Ma la mia idea qui richiede che JMP faccia qualcosa di simile a ciò che fa perl, fondamentalmente tenendo traccia se qualcosa viene chiamato in un contesto scalare o di lista, vale a dire se una funzione viene usata in un modo che si aspetta una lista in ritorno, restituisce una lista, altrimenti restituisce uno scalare. In questo modo Col Max() qui potrebbe restituire una lista per Col Min(), che a sua volta restituirebbe un valore scalare.
Immagino che mi sfugga qualcosa e non riesco a capire cosa.
Re: Come identificare i minimi dei massimi nei gruppi di datiNo, l'idea NON è che JMP esamini UNA VOLTA la tabella riga per riga e calcoli l'intera espressione.
Re: Come identificare i minimi dei massimi nei gruppi di datiPer scoprire cosa fa JMP, creiamo prima una tabella dati molto piccola...
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt = dt0 << Clear Select << Select Rows( [2, 10, 11, 25] ) << Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
nr = n rows(current data table());
... e una colonna formula con alcune funzionalità di registro:
New Column( "test", Formula(Col Min(Write( "\!nmin:" || (Char( Row() )) );if(row()==nr, write("\!n") );:height, :age)));l'output:

Quindi, in questo caso, JMP esegue il codice più volte.
Ci penseremo più tardi...
Re: Come identificare i minimi dei massimi nei gruppi di datiOra controlliamo con
New Column( "test",
Formula(
Col Min(
Write( "\!nmin:" || (Char( Row() ) || "\!n\!n") );
Col Max(
Write( "max:" || (Char( Row() ) || "\!n") );
:height;,
:age,
:sex
);,
:age
)
)
)
... e otteniamo *)

che mostra:
- per il semplice esempio JMP valuta il primo argomento di Col Min per ogni riga
- per la seconda versione, JMP valuta il primo argomento di Col Min per ogni riga e poiché c'è un'altra aggregazione Col... all'interno di questo codice, questa è seguita dal ciclo ColMax : primo argomento di Col Max per ogni riga
Alla fine, JMP conosce il valore di ColMax(...) per ogni singola riga e può quindi valutare Col min con questi valori.
Questo è più o meno quello che dici, con il contesto di elenco. Ma penso che JMP memorizzi i risultati nel contesto della tabella dati. In modo tale da poter combinare i VALORI con informazioni aggiuntive come row(), row states() ..
ma qualcuno di JMP - o @jthi - potrebbe spiegare meglio...
*) di nuovo: più volte:
ulteriori dettagli possono essere trovati qui:
https://community.jmp.com/t5/Discussions/Statistical-functions-Col-Mean-for-example-possibly-bugged-on/mp/613887/highlight/true#M81398
Re: Come identificare i minimi dei massimi nei gruppi di datiun altro modo per testare l'esecuzione del codice:
i = 0;
j = 0;
New Column( "test",
Formula(
Col Min(
i++;
Col Max(
j++;
:height;,
:age,
:sex
);,
:age
)
)
);
// too early
Show( i );
Show( j );
Current Data Table() << run formulas();
// after calculating the values
Show( i );
Show( j );

io = 5 x 4
j = 5 x 5 x 4
Re: Come identificare i minimi dei massimi nei gruppi di dati-
Re: Come identificare i minimi dei massimi nei gruppi di datiLe funzioni statistiche Col hanno una loro magia che altre funzioni non hanno, ad esempio hanno la memorizzazione nella cache interna e supportano byvars. https://www.jmp.com/support/help/en/18.0/#page/jmp/statistical-functions.shtml#
Re: Come identificare i minimi dei massimi nei gruppi di datiSì, questo modo intelligente di preparare i dati è estremamente utile:
esempi di come funziona la magia:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << Clear Select << Select Rows( Index( 5, 40 ) ) <<DELETE rows=""></DELETE>newCol << Set Formula(Col Min(Print(row());:height,:age)); // 2 x 4<BR /><BR />newCol << Set each value(Col Min(Col Max(Print(row());:height,:sex),:age)); // 4 + 4
newCol << Set Formula(Col Min(Col Max(Print(row());:height,:sex),:age)); // 2 x 4 + 4
Assicurati di non imbatterti in uno di questi rubinetti:
i=1;<BR />newCol << set each value (Col Min(Print("X");:height,:age)); // 16 = 4 x 4
newCol << set Formula (Col Min(Print("X");:height,:age)); // 20 = 5 x 4<BR />newCol << set Formula (Col Min("x";Print(3);:height,:age)); // 20 = 5 x 4
newCol << Set Formula(Col Min(i;Print(row());:height,:age)); // 20 = 5 x 4<BR />
newCol << set each value (Col Min(Col Max(Print("X");:height,:sex),:age)); // 80 = 5 x 4 x 4
newCol << set Formula (Col Min(Col Max(Print("X");:height,:sex),:age)); // 100 = 5 x 5 x 4<BR />newCol << set Formula (Col Min(Col Max("X";Print(3);:height,:sex),:age)); // 100 = 5 x 5 x 4
newCol << Set Formula(Col Min(Col Max(i;Print(row());:height,:sex),:age)); // 100 = 5 x 5 x 4
Le aggregazioni di colonne diventano caute quando vedono
poi passano a una velocità ridotta e calcolano ogni valore per ogni riga (+1) ... in un albero gerarchico.
Re: Come identificare i minimi dei massimi nei gruppi di datiNon sono sicuro di essere abbastanza intelligente da seguire tutto quello che fai qui...
Sembra che tu sia d'accordo con me? Cioè che le funzioni Col... fanno cose diverse nei contesti scalari e di lista?
Re: Come identificare i minimi dei massimi nei gruppi di datiAspettiamo un anno e discutiamone di nuovo: le cose potrebbero cambiare.