스크립팅 도움 요청 - 동등성 테스트에서 유형 1 오류에 대한 시뮬레이터 만들기안녕하세요 여러분,
무작위 데이터 세트(n=3개의 기준 및 테스트 측정값)를 생성한 후 특정 개수(1000개 또는 그 이상)로 시뮬레이션을 실행하는 스크립트를 작성하려고 합니다. 각 세트에 대해 동등성 검정을 실행하고, 동등성이 입증된 이벤트의 빈도를 출력으로 보고서/표로 출력하고 싶습니다. 이 도구의 목표는 특정 동등성 마진을 고려할 때 제1종 오류의 확률을 제공하는 것입니다.
다음 코드를 찾았는데 작동하지 않아서 거의 막혔습니다. 그룹에서 어떤 지침이나 도움을 주실 수 있다면 정말 감사하겠습니다.
감사해요!
크리스
// 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)) || "%")
);
자동화 및 스크립팅Re: 스크립팅 도움 요청 - 동등성 테스트에서 유형 1 오류에 대한 시뮬레이터 만들기어떤 부분에서 어려움을 겪고 있나요?
Re: 스크립팅 도움 요청 - 동등성 테스트에서 유형 1 오류에 대한 시뮬레이터 만들기H 자르모,
현재 동등성 보고서에서 중요한 T 값을 추출하려고 하면 코드가 작동하지 않습니다. 하지만 다른 문제도 있습니다. 시뮬레이션과 동등성 테스트는 실행되지만 보고서에서 값을 가져올 수 없는 경우가 있었습니다.
저는 이런 것 중 일부를 AI에도 적용해 보려고 했지만, 일부 구문과 코딩 규칙이 올바르지 않은 것 같습니다.
크리스
Re: 스크립팅 도움 요청 - 동등성 테스트에서 유형 1 오류에 대한 시뮬레이터 만들기저는 다음과 같은 편집을 제안하고 싶습니다.
StudentTQuantile() 함수가 없습니다. t Quantile()이라고 해야 합니다.
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 ) ) || "%" )
);
Re: 스크립팅 도움 요청 - 동등성 테스트에서 유형 1 오류에 대한 시뮬레이터 만들기자르모,
제안과 설명 감사합니다. 정말 효과가 있네요!
저는 모든 것이 어떻게 작동하는지 내부적으로 이해하기 위해 코드를 살펴보려고 합니다... 도움을 주셔서 감사합니다!
크리스
Re: 스크립팅 도움 요청 - 동등성 테스트에서 유형 1 오류에 대한 시뮬레이터 만들기원래 코드는 LLM에서 만든 것처럼 보입니다(JSL에 대해 알고 있다면 LLM에서 저지르는 명백한 오류 때문일 것입니다).
이미 실행 가능한 버전이 제공되었지만, 제가 접근하는 방식은 다음과 같습니다. 이 버전은 행렬을 사용하는 약간 더 복잡한 버전이며(일반적으로 더 빠름), 계산 결과는 아직 검증하지 않았습니다.
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)) || "%")
);