Salut tout le monde,
Je cherche à écrire un script qui génère un jeu de données aléatoire (n=3 mesures de référence et de test) puis effectue une simulation avec un nombre donné d'éléments (1000, par exemple). Pour chaque jeu de données, je réalise un test d'équivalence et souhaite obtenir un rapport/tableau indiquant la fréquence des événements où l'équivalence a été démontrée. L'objectif de cet outil est de calculer la probabilité d'erreurs de type I pour une marge d'équivalence donnée.
J'ai abouti au code suivant, mais il ne fonctionne pas et je suis complètement bloqué. Toute aide ou suggestion de la part du groupe serait grandement appréciée.
Merci!
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)) || "%")
);