Ciao a tutti,
Sto cercando di realizzare un simulatore che generi un numero definito di ripetizioni (diciamo 1000) di dati casuali da un campione di riferimento e di prova, quindi esegua un test di equivalenza su ogni simulazione e riporti la frequenza degli errori di tipo 1 (che dimostrano falsamente l'equivalenza) dato un margine di equivalenza definito.
Utilizzando l'intelligenza artificiale e un po' di ricerca, ho creato il codice qui sotto, ma non riesco a farlo funzionare. Sono relativamente nuovo nello scripting, quindi sono sicuro che le risposte siano abbastanza semplici... solo che non per me!
Qualsiasi aiuto che possiate fornirci sarà apprezzato.
Grazie!
// Parametri
numSimulazioni = 1000;
nPerGruppo = 3;
rifMedia = 99,1;
testMean = 98,8;
deviazione standard = 0,1;
equivMargin = 0,3;
tipo1Errori = 0;
// Valore t critico per CI al 90% con df = 2n - 2
df = 2 * nPerGruppo - 2;
tCrit = StudentTQuantile(0,950, df);
// Crea una tabella riepilogativa
summaryTable = Nuova tabella("Riepilogo simulazione",
Nuova colonna("Simulazione", Numerico),
Nuova colonna("CI_Lower", numerico),
Nuova colonna("CI_Upper", numerico),
Nuova colonna("Equivalenza_Conclusa", Carattere),
Nuova colonna("Mean_Diff", numerico)
);
// Esegui un ciclo tra le simulazioni
Per(sim = 1, sim <= numSimulazioni, sim++,
// Crea una nuova tabella dati
dt = Nuova tabella("Sim" || Char(sim),
Aggiungi righe (nPerGroup * 2),
Nuova colonna("Gruppo", Carattere),
Nuova colonna("Valore", Numerico)
);
// Simula il gruppo di riferimento
Per(i = 1, i <= nPerGroup, i++,
dt:Group[i] = "Riferimento";
dt:Value[i] = Random Normal(refMean, sd);
);
// Simula il gruppo di test
Per(i = nPerGroup + 1, i <= nPerGroup * 2, i++,
dt:Group[i] = "Test";
dt:Value[i] = Random Normal(testMean, sd);
);
// Estrai valori
refVals = dt << Ottieni come matrice( :Valore )[1::nPerGruppo];
testVals = dt << Ottieni come matrice( :Valore )[nPerGruppo+1::nPerGruppo*2];
meanDiff = Media(testVals) - Media(refVals);
// Variazioni campione
varRef = Varianza(valoririf);
varTest = Varianza(testVals);
// Varianza aggregata
pooledVar = ((nPerGroup - 1) * varRef + (nPerGroup - 1) * varTest) / df;
pooledSD = Sqrt(pooledVar);
// Errore standard della differenza
seDiff = pooledSD * Sqrt(2 / nPerGroup);
// 90% CI
ciLower = meanDiff - tCrit * seDiff;
ciUpper = meanDiff + tCrit * seDiff;
// Controlla l'equivalenza
eqResult = "No";
Se(ciLower > -equivMargin & ciUpper < equivMargin,
tipo1Errori++;
eqResult = "Sì";
);
// Registra i risultati
summaryTable << Aggiungi righe(1);
riepilogoTabella:Simulazione[sim] = sim;
summaryTable:CI_Lower[sim] = ciLower;
summaryTable:CI_Upper[sim] = ciUpper;
summaryTable:Equivalence_Concluded[sim] = eqResult;
summaryTable:Mean_Diff[sim] = meanDiff;
// Chiudere la tabella per evitare confusione
dt << Chiudi finestra;
);
// Mostra risultati
Nuova finestra("Riepilogo errori di tipo I",
Casella di testo("Simulazioni totali: " || Char(numSimulazioni)),
Casella di testo("Errori di tipo I: " || Char(type1Errors)),
Casella di testo("Tasso di errore di tipo I stimato: " || Char(Round(type1Errors / numSimulations * 100, 2)) || "%")
);