请求脚本编写帮助 - 为等效性测试中的 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)) || "%")
);