請求腳本編寫協助 - 為等效性測試中的 I 類錯誤編寫模擬器大家好,
我正在嘗試編寫一個腳本,該腳本將生成一個隨機資料集(n=3,包含參考值和測試值),然後運行一個包含一定數量(例如 1000)的模擬。對於每個資料集,我將執行一次等效性檢驗,並希望輸出一個報告/表格,其中包含證明等效性的事件發生的頻率。此工具的目標是在給定等效性界值的情況下,計算出 I 類錯誤的機率。
我寫了以下程式碼,但它無法正常運行,我徹底卡住了。若各位能提供任何指導或協助,我將不勝感激。
謝謝!
克里斯
// 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)) || "%")
);
自動化和腳本編寫回覆:請求腳本編寫幫助 - 為等效性測試中的 I 類錯誤建立模擬器你卡在哪一部分了?
回覆:請求腳本編寫幫助 - 為等效性測試中的 I 類錯誤建立模擬器H Jarmo,
目前,程式碼在嘗試從等效性報告中提取關鍵 T 值時出錯。但還有其他問題。我曾經遇到過這樣的情況:程式碼可以運行模擬和等效性測試,但無法從報告中取得數值。
我也嘗試過把其中一些程式碼交給人工智慧處理,但我認為其中一些語法和編碼規格可能不正確。
克里斯
回覆:請求腳本編寫幫助 - 為等效性測試中的 I 類錯誤建立模擬器我建議進行以下修改:
沒有 StudentTQuantile() 函數。應該是 tQuantile() 函數。
Variance() 不是內建函數。請在腳本中定義它(或直接對 Std Dev() 平方)。
refVals = dt << Get As Matrix( :Value )[1::nPerGroup] 應該更像 refVals = dt:Value[Where( :Group == "Reference")];
testVals 也是一樣 =
將 dt 的可見性設定為「私有」可以大大加快處理速度。
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 ) ) || "%" )
);
回覆:請求腳本編寫幫助 - 為等效性測試中的 I 類錯誤建立模擬器雅爾莫,
謝謝你的建議和解釋。這方法確實有效!
我打算仔細研究程式碼,努力理解它的工作原理……非常感謝您的幫助!
克里斯
回覆:請求腳本編寫幫助 - 為等效性測試中的 I 類錯誤建立模擬器原始程式碼看起來很有可能是 LLM 寫的(如果你懂一些 JSL,你會發現他們犯了一些明顯的錯誤)。
已經提供了一個可運行的版本,但這裡我介紹一下我的方法。這是一個稍微複雜一點的版本,使用了矩陣(通常矩陣速度更快),而且我還沒有驗證計算結果。
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)) || "%")
);