Hilfe bei der Skripterstellung benötigt – Entwicklung eines Simulators für Fehler vom Typ 1 bei ÄquivalenztestsHallo zusammen,
Ich versuche, ein Skript zu schreiben, das einen zufälligen Datensatz (n=3 Referenz- und Testmessungen) generiert und anschließend eine Simulation mit einer beliebigen Anzahl von Messungen (z. B. 1000) durchführt. Für jeden Datensatz soll ein Äquivalenztest durchgeführt werden, und die Ausgabe soll ein Bericht/eine Tabelle mit der Häufigkeit der Ereignisse sein, bei denen Äquivalenz nachgewiesen wurde. Ziel dieses Tools ist es, die Wahrscheinlichkeit für Fehler 1. Art bei einer bestimmten Äquivalenzmarge zu berechnen.
Ich habe folgenden Code gefunden, aber er funktioniert nicht und ich komme nicht weiter. Ich wäre für jede Hilfe oder Anregung aus der Gruppe sehr dankbar.
Danke!
Chris
// Parameters
numSimulations = 10;
nPerGroup = 3;
refMean = 99.1;
testMean = 98.8;
sd = 0.1;
equivMargin = 0.3;
type1Errors = 0;
// Critical t-value for 90% CI with df = 2n - 2
df = 2 * nPerGroup - 2;
tCrit = StudentTQuantile(0.950, df);
// Create summary table
summaryTable = New Table("Simulation Summary",
New Column("Simulation", Numeric),
New Column("CI_Lower", Numeric),
New Column("CI_Upper", Numeric),
New Column("Equivalence_Concluded", Character),
New Column("Mean_Diff", Numeric)
);
// Loop through simulations
For(sim = 1, sim <= numSimulations, sim++,
// Create new data table
dt = New Table("Sim" || Char(sim),
Add Rows(nPerGroup * 2),
New Column("Group", Character),
New Column("Value", Numeric)
);
// Simulate Reference group
For(i = 1, i <= nPerGroup, i++,
dt:Group[i] = "Reference";
dt:Value[i] = Random Normal(refMean, sd);
);
// Simulate Test group
For(i = nPerGroup + 1, i <= nPerGroup * 2, i++,
dt:Group[i] = "Test";
dt:Value[i] = Random Normal(testMean, sd);
);
// Extract values
refVals = dt << Get As Matrix( :Value )[1::nPerGroup];
testVals = dt << Get As Matrix( :Value )[nPerGroup+1::nPerGroup*2];
meanDiff = Mean(testVals) - Mean(refVals);
// Sample variances
varRef = Variance(refVals);
varTest = Variance(testVals);
// Pooled variance
pooledVar = ((nPerGroup - 1) * varRef + (nPerGroup - 1) * varTest) / df;
pooledSD = Sqrt(pooledVar);
// Standard error of difference
seDiff = pooledSD * Sqrt(2 / nPerGroup);
// 90% CI
ciLower = meanDiff - tCrit * seDiff;
ciUpper = meanDiff + tCrit * seDiff;
// Check equivalence
eqResult = "No";
If(ciLower > -equivMargin & ciUpper < equivMargin,
type1Errors++;
eqResult = "Yes";
);
// Log results
summaryTable << Add Rows(1);
summaryTable:Simulation[sim] = sim;
summaryTable:CI_Lower[sim] = ciLower;
summaryTable:CI_Upper[sim] = ciUpper;
summaryTable:Equivalence_Concluded[sim] = eqResult;
summaryTable:Mean_Diff[sim] = meanDiff;
// Close the table to avoid clutter
dt << Close Window;
);
// Show results
New Window("Type I Error Summary",
Text Box("Total Simulations: " || Char(numSimulations)),
Text Box("Type I Errors: " || Char(type1Errors)),
Text Box("Estimated Type I Error Rate: " || Char(Round(type1Errors / numSimulations * 100, 2)) || "%")
);
Automatisierung und SkripterstellungBetreff: Hilfe bei der Skripterstellung erbeten – Erstellung eines Simulators für Fehler 1. Art beim ÄquivalenztestAn welchem Teil hängen Sie fest?
Betreff: Hilfe bei der Skripterstellung erbeten – Erstellung eines Simulators für Fehler 1. Art beim ÄquivalenztestH Jarmo,
Aktuell schlägt der Code beim Versuch, die kritischen T-Werte aus dem Äquivalenzbericht zu extrahieren, fehl. Es gibt aber auch andere Probleme. Ich hatte es schon einmal geschafft, die Simulation und die Äquivalenztests durchzuführen, aber keine Werte aus dem Bericht zu erhalten.
Ich habe versucht, einiges davon auch bei KI anzuwenden, aber ich glaube, dass einige der Syntax- und Codierungskonventionen fehlerhaft sein könnten.
Chris
Betreff: Hilfe bei der Skripterstellung erbeten – Erstellung eines Simulators für Fehler 1. Art beim ÄquivalenztestIch würde folgende Änderungen vorschlagen:
Es gibt keine Funktion StudentTQuantile(). Das sollte t Quantile() heißen.
Die Funktion Variance() ist nicht vordefiniert. Definieren Sie sie in Ihrem Skript (oder quadrieren Sie stattdessen einfach die Standardabweichung()).
refVals = dt << Get As Matrix( :Value )[1::nPerGroup] sollte eher so aussehen: refVals = dt:Value[Where( :Group == "Reference" )];
Gleiches gilt für testVals =
Um den Vorgang erheblich zu beschleunigen, stellen Sie die Sichtbarkeit für dt auf „Privat“.
Variance = Function( {Values},
Return( Std Dev( Values ) ^ 2 )
);
// Parameters
numSimulations = 1000;
nPerGroup = 3;
refMean = 99.1;
testMean = 98.8;
sd = 0.1;
equivMargin = 0.3;
type1Errors = 0;
// Critical t-value for 90% CI with df = 2n - 2
df = 2 * nPerGroup - 2;
tCrit = t Quantile( 0.950, df );
// Create summary table
summaryTable = New Table( "Simulation Summary",
New Column( "Simulation", Numeric ),
New Column( "CI_Lower", Numeric ),
New Column( "CI_Upper", Numeric ),
New Column( "Equivalence_Concluded", Character ),
New Column( "Mean_Diff", Numeric )
);
// Loop through simulations
For( sim = 1, sim <= numSimulations, sim++,
// Create new data table
dt = New Table( "Sim" || Char( sim ), "Private", Add Rows( nPerGroup * 2 ), New Column( "Group", Character ), New Column( "Value", Numeric ) );
// Simulate Reference group
For( i = 1, i <= nPerGroup, i++,
dt:Group[i] = "Reference";
dt:Value[i] = Random Normal( refMean, sd );
);
// Simulate Test group
For( i = nPerGroup + 1, i <= nPerGroup * 2, i++,
dt:Group[i] = "Test";
dt:Value[i] = Random Normal( testMean, sd );
);
// Extract values
refVals = dt:Value[Where( :Group == "Reference" )];
testVals = dt:Value[Where( :Group == "Test" )];
meanDiff = Mean( testVals ) - Mean( refVals );
// Sample variances
varRef = Variance( refVals );
varTest = Variance( testVals );
// Pooled variance
pooledVar = ((nPerGroup - 1) * varRef + (nPerGroup - 1) * varTest) / df;
pooledSD = Sqrt( pooledVar );
// Standard error of difference
seDiff = pooledSD * Sqrt( 2 / nPerGroup );
// 90% CI
ciLower = meanDiff - tCrit * seDiff;
ciUpper = meanDiff + tCrit * seDiff;
// Check equivalence
eqResult = "No";
If( ciLower > -equivMargin & ciUpper < equivMargin,
type1Errors++;
eqResult = "Yes";
);
// Log results
summaryTable << Add Rows( 1 );
summaryTable:Simulation[sim] = sim;
summaryTable:CI_Lower[sim] = ciLower;
summaryTable:CI_Upper[sim] = ciUpper;
summaryTable:Equivalence_Concluded[sim] = eqResult;
summaryTable:Mean_Diff[sim] = meanDiff;
// Close the table to avoid clutter
dt << Close Window;
);
// Show results
New Window( "Type I Error Summary",
Text Box( "Total Simulations: " || Char( numSimulations ) ),
Text Box( "Type I Errors: " || Char( type1Errors ) ),
Text Box( "Estimated Type I Error Rate: " || Char( Round( type1Errors / numSimulations * 100, 2 ) ) || "%" )
);
Betreff: Hilfe bei der Skripterstellung erbeten – Erstellung eines Simulators für Fehler 1. Art beim ÄquivalenztestJarmo,
Danke für den Tipp und die Erklärung. Das funktioniert tatsächlich!
Ich werde den Code durcharbeiten, um zu verstehen, wie alles funktioniert... Vielen Dank für Ihre Hilfe!
Chris
Betreff: Hilfe bei der Skripterstellung erbeten – Erstellung eines Simulators für Fehler 1. Art beim ÄquivalenztestDer ursprüngliche Code sieht ziemlich eindeutig nach LLM aus (aufgrund der offensichtlichen Fehler, die sie machen, wenn man sich mit JSL auskennt).
Eine funktionierende Version liegt bereits vor, aber hier ist mein Ansatz. Dies ist eine etwas komplexere Version mit Matrizen (die in der Regel schneller sind), und ich habe die Berechnungen nicht überprüft.
Names Default To Here(1);
numSimulations = 1000;
nPerGroup = 3;
refMean = 99.1;
testMean = 98.8;
sd = 0.1;
equivMargin = 0.3;
type1Errors = 0;
df = 2 * nPerGroup - 2;
tCrit = t Quantile(0.950, df);
dt = New Table("Simulation Summary",
New Column("Simulation", Numeric),
New Column("CI_Lower", Numeric),
New Column("CI_Upper", Numeric),
New Column("Equivalence_Concluded", Character),
New Column("Mean_Diff", Numeric),
Invisible
);
For(sim = 1, sim <= numSimulations, sim++,
m_ref = J(nperGroup, 1, Random Normal(refMean, sd));
m_test = J(nperGroup, 1, Random Normal(testMean, sd));
avgdiff = Mean(m_test) - Mean(m_ref);
var_ref = Std Dev(m_ref)^2;
var_test = Std Dev(m_test)^2;
pooledVar = ((nPerGroup - 1) * var_ref + (nPerGroup - 1) * var_test) / df;
pooledSD = Sqrt(pooledVar);
seDiff = pooledSD * Sqrt(2 / nPerGroup);
ciLower = avgdiff - tCrit * seDiff;
ciUpper = avgdiff + tCrit * seDiff;
eqResult = "No";
If(ciLower > -equivMargin & ciUpper < equivMargin,
type1Errors++;
eqResult = "Yes";
);
dt << Add Rows(
{Simulation = sim, CI_Lower = ciLower, CI_Upper = ciUpper, Equivalence_Concluded = eqResult, Mean_Diff = avgdiff}
);
);
dt << Show Window(1);
nw = New Window("Type I Error Summary",
Text Box("Total Simulations: " || Char(numSimulations)),
Text Box("Type I Errors: " || Char(type1Errors)),
Text Box("Estimated Type I Error Rate: " || Char(Round(type1Errors / numSimulations * 100, 2)) || "%")
);