Führen Sie eine Berechnungsauswertung in einem assoziativen Array durchHallo,
Ich versuche, eine Funktion dazu zu bringen, eine in einem assoziativen Array gespeicherte Standardabweichungsberechnung zurückzugeben. Mein Code gibt nur den Ausdruck des assoziativen Arrays und nicht die Berechnung zurück.Könnten Sie mir bitte sagen, was mit meinem Code nicht stimmt?
cvf = Max ( erneut auflisten ) ;// mein Lebenslauf in der Datei ist 8
Lebenslauf = Assoziatives Array () ;
Lebenslauf [ 6 ] = Assoziatives Array ({( Standardabw ( 5 , 6 , 7 , 8 , 9 , 10 ))}) ;
Lebenslauf [ 8 ] = Assoziatives Array ({( Standardabw ( 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ))}) ;
Lebenslauf [ 12 ] = Assoziatives Array ({( Standardabw ( 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ))}) ;
CVC = Funktion ( { ref } , Lokal ({ Lebenslauf = Assoziatives Array ({ cvf , Bewertung ( cvf )} )} , Lebenslauf << Werte erhalten ( cvf )) ; Lebenslauf [ ref ]) ; ) ;
A = CVC ( cvf ) ;
evalu ( Bewertungsausdruck ( A )) ;
Show(a);
Dies ist die Ausgabe, die ich bekomme:
a = Assoziatives Array({{Std Dev( 5, 6, 7, 8, 9, 10, 11, 12 ), 1}}, 0);
Dies ist die Ausgabe, die ich möchte: a= 2,5
Betreff: Berechnungsauswertung im assoziativen Array durchführenSummarize(age grp) ist eine Liste mit zwei Listen und ist nicht mit dem assoziativen Array (age grp) kompatibel. Außerdem befinden sich „avg“ und „sd“ in einer einzigen Liste, die für Querverweise mit „Summary(age grp)“ nicht kompatibel ist. Der folgende Code richtet die Listen korrekt aus (nicht schön).
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( sum = By( :age),sex grp= By (:sex), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
sex grp = Associative Array( :sex ) << Get Keys;
dt << New Column( "CV" ) << New Column( "AVG" ) << New Column( "SD" );
For( g = 1, g <= nitems(age grp), g++,
For(i =1, i<=nitems(sex grp), i++,
rows = dt << get rows where( :age == age grp[g] & :sex == sex grp[i] );
if( i==1,
:AVG[rows] = avg[ g*2-1 ];
:SD[rows] = sd[ g*2-1 ];
:CV[rows] = 100 * avg[ g*2-1 ] / sd[ g*2-1 ];
,
:AVG[rows] = avg[ g*i ];
:SD[rows] = sd[ g*i ];
:CV[rows] = 100 * avg[ g*i ] / sd[ g*i ];
)));
Betreff: Berechnungsauswertung im assoziativen Array durchführenDanke, es funktioniert
Betreff: Berechnungsauswertung im assoziativen Array durchführenIch bin mir nicht sicher, wann es erschien, aber zu Ihrer Information: Mir ist gerade aufgefallen, dass in meiner Version von JMP (13) „Lebenslauf“ eine der Statistiken ist, die von „Tabellen > Zusammenfassung“ bereitgestellt werden. Die Formelspalte wird also nicht benötigt.
Betreff: Berechnungsauswertung im assoziativen Array durchführenEs tut mir leid, dass ich die Tatsache übersehen habe, dass Sie zwei Gruppierungsvariablen haben. Dieses modifizierte Skript zeigt Ihnen, wie es funktioniert.
Names Default to Here( 1 );
// Open example of a data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Estimate group statistics and group identities
Summarize( age sex grp = By( :age, :sex ), avg = Mean( :height ), sd = Std Dev( :height ) );
// Make a new columns for group result
dt << New Column( "Avg" ) << New Column( "SD" ) << New Column( "CV" );
// Iterate over groups
For( g = 1, g <= N Items( age grp ), g++,
// Convert :age level to match data type of identity
rows = dt << Get Rows Where( Char( :age ) == age sex grp[1][g] & :sex == age sex grp[2][g] );
:Avg[rows] = avg[g];
:SD[rows] =sd[g];
:CV[rows] = 100 * sd[g] / avg[g];
);
Ich glaube nicht, dass ein assoziatives Array die effizienteste Methode zur Identifizierung der Gruppen ist. Die Funktion Summarize() schätzt gleichzeitig die Gruppenstatistiken und identifiziert die zugehörige Gruppe mithilfe zweier paralleler Listen von Gruppenebenen. Der einzige Nachteil besteht meiner Meinung nach darin, dass es sich bei den Gruppierungsebenen immer um Zeichenfolgen handelt, auch wenn die ursprünglichen Ebenen numerisch sind, wie in diesem Fall :agelevels. Daher musste ich die :age-Ebene für den Vergleich konvertieren, der zum Erhalten der Zielzeilennummern verwendet wurde.
Jetzt haben Sie zwei Ansätze, einschließlich Ians Lösung mit dem Befehl „Summary“.
Betreff: Berechnungsauswertung im assoziativen Array durchführenSie könnten versuchen herauszufinden, ob dies effizienter ist (was ich vielleicht erwarten würde):
Names Default To Here( 1 );
// Example table
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Edit to taste . . .
var = Column(dt, "height");
byVars = {Column(dt, "sex"), Column(dt, "age")};
// Use a summary table with formula column
dt2 = dt << Summary(Group(byVars), Mean(var), Std Dev(var));
Column(dt2, 4) << setName("Mean");
Column(dt2, 5) << setName("StdDev");
dt2 << New Column( "CV", Numeric, "Continuous", Format( "Percent", 12, 3 ), Formula(:StdDev/:Mean));
Wenn Sie die CV-Werte in der Originaltabelle benötigen, verwenden Sie „Tabellen > Join“.
Betreff: Berechnungsauswertung im assoziativen Array durchführenHallo Mark ,
Ich verwende Ihr Beispiel und kann die Zeilennummer korrekt ermitteln, aber der Durchschnitt und die Standardabweichung sind nicht korrekt. Und meine Tabelle hat mehr als 10.000 Zeilen, die Berechnung ist etwas langsam. Könnten Sie mir bitte sagen, was ich falsch gemacht habe? Danke.
Namen werden standardmäßig hier angezeigt ( 1 ) ;
dt = Offen ( „$SAMPLE_DATA/Big Class.jmp“ ) ;
Zusammenfassen ( Alter grp = Von ( : Alter ) , Sexgruppe = Von ( : Sex ) , Durchschn = Bedeuten ( : Höhe ) , sd = Standardabw ( : Höhe ) ) ;
Alter grp = Assoziatives Array ( : Alter ) << Holen Sie sich Schlüssel ;
Sexgruppe = Assoziatives Array ( : Sex ) << Holen Sie sich Schlüssel ;
dt << Neue Spalte ( "LEBENSLAUF" ) ;
Für ( G = 1 , G <= nitems ( Alter grp ) , G ++,
für ( ich = 1 , ich <= nitems ( Sexgruppe ) , ich ++,
Reihen = dt << Holen Sie sich Zeilen wo ( : Alter == Alter grp [ G ] & : Sex == Sexgruppe [ ich ]) ;
: Lebenslauf [ Reihen ] = 100 * sd [ ich ] / Durchschn [ ich ] ;
)) ;
Betreff: Berechnungsauswertung im assoziativen Array durchführenDanke, das ist es, was ich suche. Danke.
Shu
Betreff: Berechnungsauswertung im assoziativen Array durchführenVersuchen Sie dieses Beispiel:
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( age grp = By( :age ), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
dt << New Column( "CV" );
For( g = 1, g <= N Items( age grp ), g++,
rows = dt << Get Rows Where( :age == age grp[g] )
:CV[rows] = 100 * sd[g] / avg[g];
);
Betreff: Berechnungsauswertung im assoziativen Array durchführenEs gibt drei Spalten in einer Datentabelle, und eine gibt die Replikatnummer an, die andere hat einen Signalausgang für das Replikat und die letzte hat die Daten-ID. und ich muss die Standardabweichung für alle Daten-IDs berechnen. Alle Daten haben nur zwei Replikate, mit Ausnahme eines bestimmten Typs namens „Titer“. Je nachdem, wo die Daten generiert werden, kann der Datentyp „Titer“ 6, 8 oder 12 Replikate haben. Daher erstelle ich diese drei Fälle als Array und verknüpfe sie mit der Replikatspalte.
Ich ändere meinen Code und kehre die Formel zur Standardabweichungsberechnung zurück. Wenn ich diese jedoch in eine neue Spalte für die CV-Berechnung einfüge, geschieht nichts.
Die andere Option, die ich mir vorstellen kann, besteht darin, die Tabulate-Plattform zu verwenden, um die Standardabweichungen abzurufen, sie in ein Array einzufügen und sie der neuen Spalte wieder zuzuweisen. Irgendein Vorschlag?
Betreff: Berechnungsauswertung im assoziativen Array durchführenLasst uns noch einmal von vorne anfangen.
- Was versuchst du zu machen?
- Wie sind Ihre Daten?
- Wie ist es organisiert?
- Welche Ergebnisse benötigen Sie?
- Was möchten Sie mit den Ergebnissen machen?
Mir ist nicht klar, dass Sie ein assoziatives Array verwenden müssen.
Betreff: Berechnungsauswertung im assoziativen Array durchführenIch habe mein Problem herausgefunden, aber ich habe ein neues Problem.
Mein assoziiertes Array ist eine Formel und ich muss den Schlüssel abrufen, um die Berechnung durchzuführen.
Mein Code gibt a zurück, was die Formel zur Berechnung der Standardabweichung ist. aber wenn ich die Formel in eine neue Formel einfüge, führt die neue Formel die Berechnung nicht durch.
A = CVC ( cvf ) << Schlüssel bekommen ( cvf ) ;
zeigen ( A ) ;// das ist die Formel mit a:
{Std Dev(:INSTRUMENT_SIGNAL[Row() + 8], :INSTRUMENT_SIGNAL[Row() + 1], :INSTRUMENT_SIGNAL[Row() + 2], :INSTRUMENT_SIGNAL[Row() + 3], :INSTRUMENT_SIGNAL[Row() + 4], :INSTRUMENT_SIGNAL[Row() + 5], :INSTRUMENT_SIGNAL[Row() + 6], :INSTRUMENT_SIGNAL[Row() + 7])};
aber sobald ich a in die neue Formel unten eingefügt habe: a würde die Berechnung durchführen. Bitte helfen Sie!
C ol 2 << Formel festlegen ( Wenn ( : RUNSAMPLEKIND == „TITERC.NEG“ , ( A / : Durchschnittliches Signal ) * 100 ) ,
Wenn ( : RUNSAMPLEKIND [ Reihe ()] == : RUNSAMPLEKIND [ Reihe () + 1 ] ,
Wenn ( : REP [ Reihe ()] != 2 , ( Standardabw ( : INSTRUMENT_SIGNAL [ Reihe () + 1 ] , : INSTRUMENT_SIGNAL [ Reihe ()] ) / : Durchschnittliches Signal ) * 100 ) ) ) ;