Wählen Sie zufällig Gruppen aus und ermitteln Sie den MittelwertHallo,
Ich habe einen Datensatz von ca. 2000 Personen, stratifiziert nach 3 Kategorien (Geschlecht/Alter/ethnische Zugehörigkeit). Ich möchte Werte für diese Personen „zusammenfassen“, indem ich etwa 8 Personen jedes Geschlechts/Alters/jeder ethnischen Zugehörigkeit nehme und den Durchschnitt ermittle. Ein Vorbehalt besteht darin, dass sich in bestimmten Kategorien mehr Personen befinden als in den anderen. Im Anhang finden Sie eine Aufschlüsselung aller Personen, die ich erhalten habe, und deren Gruppierung. Die Kategorie 1-1-1 umfasst beispielsweise 120 Personen, sodass ich daraus 8*15 Gruppen zufälliger Personen erstellen könnte. Was ist, wenn ich eine Zahl habe, die kein Vielfaches von 8 ist?
Wie kann ich das alles in einem Schritt erledigen? Am Ende hätten wir etwa 200 Pools.

Datenmischung und -bereinigungBetreff: Zufällige Unterauswahl in Gruppen und Ermittlung des MittelwertsNachfolgend finden Sie ein Skript, das Ihre Beispieldatentabelle bearbeitet und alle gewünschten Pools erstellt.Bitte nehmen Sie sich die Zeit, das Skript zu studieren, damit Sie eventuell erforderliche Änderungen vornehmen können, um es an seine endgültige Form anzupassen
Names Default To Here( 1 );
dt = Current Data Table();
// Set the size of the pools
poolSize = 8;
thePoolNumber = 0;
// Add row number to data table
dt << New Column( "__Row__", Set Each Value( Row() ) );
// Create a working data table
dt2 = dt << subset(
selected rows( 0 ),
columns( {"Gender", "Ethnicity", "Age", "__Row__"} ),
output table( "Working" )
);
// Create start of final data table
dt2 << select rows( 1 );
dtPool = dt2 << subset( selected rows( 1 ), selected columns( 0 ), output table( "Final" ) );
dtPool << select rows( 1 );
dtPool << delete rows;
dtPool << New Column( "Pool Number" );
thePoolNumber = 0;
// Create data pools
While( N Rows( dt2 ) >= poolSize,
// Draw a new sample
dtTemp = dt2 << Subset(
Sample Size( poolSize ),
Selected columns only( 0 ),
Stratify( :Gender, :Ethnicity, :Age )
);
// Calculate the new pool numbers
dtPoolCount = dtTemp << Summary(
Group( :Gender, :Ethnicity, :Age ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Get the current pool number
maxPool = Col Max( dtPool:Pool Number );
If( Is Missing( maxPool ),
maxPool = 0
);
// Add Pool Number to Pool Count table
dtPoolCount << New Column( "Pool Number", set each value( maxPool + Row() ) );
dtPoolCount << delete columns( N Rows );
// Set the current pool number in the current sample table
dtTemp = dtTemp << Update(
With( dtPoolCount ),
Match Columns( :Gender = :Gender, :Ethnicity = :Ethnicity, :Age = :Age )
);
// Add the sample to the dtPool table
dtPool = dtPool << concatenate( dtTemp, append to first table( 1 ) );
// Delete the selected rows from the working table
dt2 = dt2 << Update( With( dtTemp ), Match Columns( :__row__ = :__row__ ) );
//
dt2 << select where( Is Missing( :Pool Number ) == 0 );
dt2 << delete rows;
dt2 << delete columns( :Pool Number );
// Cleanup temporary tables
Close( dtTemp, nosave );
Close( dtPoolCount, nosave );
);
If( N Rows( dt2 ) > 0,
// Calculate the new pool numbers
dtPoolCount = dt2 << Summary(
Group( :Gender, :Ethnicity, :Age ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Get the current pool number
maxPool = Col Max( dtPool:Pool Number );
If( Is Missing( maxPool ),
maxPool = 0
);
// Add Pool Number to Pool Count table
dtPoolCount << New Column( "Pool Number", set each value( maxPool + Row() ) );
dtPoolCount << delete columns( N Rows );
// Set the current pool number in the current sample table
dt2 = dt2 << Update(
With( dtPoolCount ),
Match Columns( :Gender = :Gender, :Ethnicity = :Ethnicity, :Age = :Age )
);
// Add the sample to the dtPool table
dtPool = dtPool << concatenate( dt2, append to first table( 1 ) );
// Clean up
Close( dtPoolCount, nosave );
);
// Add the Pool Number to the original data table
dt << Update( With( dtPool ), Match Columns( :__Row__ = :__Row__ ) );
// Delete the Working data table and the Pool Count data table
Close( dt2, nosave );
Close( dtPool, nosave );Betreff: Zufällige Unterauswahl in Gruppen und Ermittlung des MittelwertsHallo Jim,
Die Untergruppen werden erstellt, indem in jedem Pool etwa 8 Personen vorhanden sind. Was 1-1-1 angeht, hast du recht. Diese Gruppe besteht aus 120 Personen. Wenn wir diese Personen also zufällig zusammenfassen würden, müssten sie in genau 15 Pools passen. Für die Gruppe 1-1-2, die 50 Reihen hat, würden Sie 6 Pools mit 8 Personen erstellen und die restlichen 4 würden in ihren eigenen Pool gelegt.
Ist das sinnvoll? Wir möchten, dass alle Zeilen in der Datentabelle einer bestimmten Poolnummer zugeordnet sind.
Betreff: Zufällige Unterauswahl in Gruppen und Ermittlung des MittelwertsMein JSL wird erfolgreich abgeschlossen, wenn die potenzielle Poolgröße auf 6 reduziert wird. Mein Code erfordert, dass mindestens 1 Stichprobe aus jeder Untergruppe gezogen werden kann, und da Untergruppe 1 2 4 nur 6 Beobachtungen (Zeilen) hat, die Der Code, den ich geschrieben habe, um die beste Stichprobengröße zu finden, musste geändert werden, um eine Poolgröße von 6 zu erhalten.
Aber unabhängig davon verstehe ich offenbar nicht, wie Sie Ihre Pools bestimmen.Ich habe Ihren Pool für jede Untergruppe von Daten einer Zufallsstichprobe mit einer bestimmten Stichprobengröße gleichgesetzt.Dies stellt sich als falsche Annahme meinerseits heraus.
Erstellen Sie Pools unabhängig für jede Untergruppe?Das heißt, für Untergruppe 1 1 1 gibt es 120 Datenzeilen.Wenn die Poolgröße 8 beträgt, erstellen Sie dann 15 Pools?Und dann würden Sie für Gruppe 1 1 2 mit 50 Reihen 6 Pools erstellen, wobei 4 Reihen nicht für einen Pool ausgewählt wären?
Erstellen Sie so Ihre Pools?
Hier ist die Aufschlüsselung aller Untergruppen nach Geschlecht/ethnischer Zugehörigkeit/Alter.

Meine aktuelle JSL macht nicht das, was Sie wollen. Bitte erklären Sie mir genauer, wie man Pools erstellt, und ich werde sehen, was getan werden muss, um ein funktionsfähiges Skript zusammenzustellen.
Betreff: Zufällige Unterauswahl in Gruppen und Ermittlung des Mittelwerts
Hallo Jim,
Dieses Skript führt zu einer leeren Tabelle. Was ich davon erhoffe, ist eine neue Spalte in der ursprünglichen Datentabelle namens „Pool Number“. Zu beachten ist, dass das Alter keine kontinuierliche numerische Variable ist. Es handelt sich um eine kategoriale Variable zwischen den Zahlen 1 und 4.
Sobald ich alle Proben im Originaldatensatz in ihrem Pool kategorisiert habe, kann ich den mittleren Poolwert berechnen, indem ich den Mittelwert der ~8 Proben im Pool nehme.
Ich habe die Datei als Referenz angehängt.
Der Arbeitstisch macht im Drehbuch Sinn; Sie erstellen eine Spalte, wobei jede Zeile einen eindeutigen Wert hat. Die Erstellung des endgültigen Datensatzes führt zu einem leeren Datenblatt und ich sehe nicht, woher dieser Fehler kommt.
Betreff: Zufällige Unterauswahl in Gruppen und Ermittlung des MittelwertsIch bin mir nicht ganz sicher, ob ich ein Skript erstellt habe, das das tut, was Sie wollen, aber es könnte Ihnen einen guten Anfang verschaffen.Hier erfahren Sie, was es bewirkt
- Es findet die Geschlechts-/Alters-/Ethnizitätsgruppe mit der kleinsten Bevölkerung.Diese Gruppe begrenzt die Anzahl der Pools, die erstellt werden können, da keine Zeilen in mehr als einem Pool angezeigt werden können.
- Anschließend wird versucht, die Poolgröße zu ermitteln, die die Anzahl der nicht eingeschlossenen Zeilen für diese Untergruppe minimiert.Dazu wird die Gruppengröße von 8 auf 21 erhöht und der kleinste Rest (Abfall) gefunden.
- Anschließend wird aus der Originaltabelle eine Arbeitstabelle erstellt.
- Es durchläuft den Arbeitstisch,
- Erstellt eine geschichtete Zufallsstichprobe
- Fügt das neue Beispiel zur endgültigen Pool-Datentabelle hinzu
- Löscht aus der Arbeitsdatentabelle die Zeilen, die für die letzte Teilmenge der Zufallsdatentabelle ausgewählt wurden.
- Wird so oft wie möglich wiederholt, um möglichst viele der kleinsten Untergruppendatensätze in die endgültige Pooldatentabelle aufzunehmen.
Hier ist die JSL
Names Default To Here( 1 );
dt = Current Data Table();
// Find smallest subgroup
Summarize( dt, subGroup = by( :age, :gender, :ethnicity ), size = Count( :age ) );
smallest = Min( size );
// Find best group size
minLost = 999999999;
minLostSize = .;
For( i = 8, i <= 21, i++,
If( Mod( smallest, i ) < minLost,
minLost = Mod( smallest, i );
minLostSize = i;
)
);
// Create a working data table
dt2 = dt << subset( selected rows( 0 ), selected columns( 0 ), output table( "Working" ) );
dt2 << New Column( "__row__", set each value( Row() ) );
// Create start of final data table
dt2 << select rows( 1 );
dtPool = dt2 << subset( selected rows( 1 ), selected columns( 0 ), output table( "Final" ) );
dtPool << select rows( 1 );
dtPool << delete rows;
dtPool << New Column( "Pool Number" );
thePoolNumber = 0;
// Create data pools
For( i = 1, i <= Floor( smallest / minLostSize ), i++,
dtTemp = dt2 << Subset(
Sample Size( minLostSize ),
Selected columns only( 0 ),
Stratify( :ethnicity, :Age, :Gender )
);
thePoolNumber = thePoolNumber + 1;
dtTemp << New Column( "Pool Number", set each value( thePoolNumber ) );
dtPool = dtPool << concatenate( dtTemp, append to first table( 1 ) );
// Remove selected rows from working table
dtRemove = dtTemp << subset( selected rows( 0 ), columns( __row__ ) );
dtRemove << New Column( "Delete", character, set each value( "Yes" ) );
dt2 = dt2 << Update( With( dtRemove ), Match Columns( :__row__ = :__row__ ) );
dt2 << select where( :Delete == "Yes" );
dt2 << delete rows;
dt2 << delete columns( :delete );
// Cleanup temporary tables
Close( dtTemp, nosave );
Close( dtRemove, nosave );
);
// Delete the Working data table
Close( dt2, nosave );
Ich habe dies anhand einer von mir erstellten Beispieldatentabelle getestet, daher kann es zu Problemen mit Ihrer tatsächlichen Tabelle kommen.Ich habe den Code mit Anmerkungen versehen, sodass Sie hoffentlich erfahren, was ich getan habe, und Anpassungen vornehmen können, damit er genau so funktioniert, wie Sie es benötigen.