📄 sampsi.ado
字号:
*! version 2.0.8 25jan2005
program define sampsi, rclass
version 6
gettoken m1 0 : 0, parse(" ,")
gettoken m2 0 : 0, parse(" ,")
confirm number `m1'
confirm number `m2'
syntax [, PRE(real 0) POST(real 1) r0(real -1) r1(real -1) /*
*/ r01(real -1) Method(str) SD1(real -1) SD2(real -1) * ]
if "`method'" ~= "" & `sd1' == -1 {
di in red "method() cannot be used without option sd1()"
exit 198
}
if (`pre' ~= 0 |`post' ~= 1 ) & `sd1' == -1 {
di in red /*
*/ "options pre() and post() cannot be used without option sd1()"
exit 198
}
if `r1' ~= -1 {
if `r0' == -1 {
local r0 = `r1'
}
if `r01' == -1 {
local r01 = `r1'
}
}
confirm integer number `pre'
cap confirm integer number `pre'
if _rc {
di in red "pre() must be a count"
exit 198
}
cap assert `pre' >= 0
if _rc {
di in red "pre() must be a count"
exit 198
}
cap confirm integer number `post'
if _rc {
di in red "post() must be a count"
exit 198
}
cap assert `post' >= 0
if _rc {
di in red "post() must be a count"
exit 198
}
if `post' > 1 & `r1' == -1 {
di in red "Correlation r1 is needed with more than one " /*
*/ "post-trial (follow-up) measurement"
exit 198
}
if `pre' ~= 0 & `r01' == -1 {
di in red "Correlation r01 is needed with pre-trial" /*
*/ " (baseline) measurements"
exit 198
}
if `pre' > 1 & `r0' == -1 {
di in red "Correlation r0 is needed with more than one " /*
*/ "pre-trial (baseline) measurement"
exit 198
}
if `r1' >= 1 | `r1' <-1 {
di in red "Correlation r1 must be between -1 and 1"
exit 198
}
if `r0' >= 1 | `r0' <-1 {
di in red "Correlation r0 must be between -1 and 1"
exit 198
}
if `r01' >= 1 | `r01' <-1 {
di in red "Correlation r01 must be between -1 and 1"
exit 198
}
cap assert "`method'" == "" | "`method'" == "post" | /*
*/ "`method'" == "change" | "`method'" == "ancova" | "`method'" == "all"
if _rc {
di in red "method() invalid"
exit 198
}
if "`method'" == "change" & `pre' == 0 {
di in red /*
*/ "method(change) may only be used with baseline measurements"
exit 198
}
if "`method'" == "ancova" & `pre' == 0 {
di in red /*
*/ "method(ancova) may only be used with baseline measurements"
exit 198
}
if (`pre' ~= 0 | `post' ~= 1) & "`method'" == "" {
local method "all"
}
if `sd1' == -1 { local sd1 }
if `sd2' == -1 { local sd2 }
/* HEADING */
if "`method'" == "" {
if "`sd1'" ~= "" {
local sd1 "sd1(`sd1')"
}
if "`sd2'" ~= "" {
local sd2 "sd2(`sd2')"
}
global S_w=.
_SAmpsi `m1' `m2', `sd1' `sd2' `options'
global S_4 = 1
return scalar adj = 1
return scalar power = $S_3
return scalar N_2 = $S_2
return scalar N_1 = $S_1
if $S_w~=.{
return scalar warning = $S_w
}
exit
}
*di in gr _n "Sample size and power calculations for repeated measures"
if "`sd2'" ~= "" {
local sd2opt="sd2(`sd2')"
}
if "`sd2'" == "" {
local sd2opt="sd2(`sd1')"
}
_MASs `m1' `m2', sd1(`sd1') `sd2opt' `options'
if `post' == 1 {
di in gr " number of follow-up measurements = " /*
*/ in ye %8.0f `post'
}
if `post' > 1 {
di in gr " number of follow-up measurements = " /*
*/ in ye %8.0f `post'
di in gr " correlation between follow-up measurements = " /*
*/ in ye %8.3f `r1'
}
if `pre' < 1 {
di in gr " number of baseline measurements = " /*
*/ in ye " 0"
}
if `pre' == 1 {
di in gr " number of baseline measurements = " /*
*/ in ye %8.0f `pre'
di in gr " correlation between baseline & follow-up = " /*
*/ in ye %8.3f `r01'
}
if `pre' > 1 {
di in gr " number of baseline measurements = " /*
*/ in ye %8.0f `pre'
di in gr " correlation between baseline measurements = " /*
*/ in ye %8.3f `r0'
di in gr " correlation between baseline & follow-up = " /*
*/ in ye %8.3f `r01'
}
****
/* POST */
if "`method'" == "post" | "`method'" == "all" {
di _n in gr "Method:" in ye " POST"
local sd_r = ((1 + (`post' - 1) * `r1')/`post')^.5
local sd1_adj = `sd1'*`sd_r'
if "`sd2'" ~= "" {
local sd2_adj = `sd2'*`sd_r'
di in gr " relative efficiency = " in ye %8.3f /*
*/(`sd_r')^-2 _n /*
*/ in gr " adjustment to sd = " in ye %8.3f /*
*/ `sd_r' _n /*
*/ in gr " adjusted sd1 = " in ye %8.3f /*
*/ `sd1_adj' _n /*
*/ in gr " adjusted sd2 = " in ye %8.3f /*
*/ `sd2_adj' _n
qui _SAmpsi `m1' `m2', sd1(`sd1_adj') sd2(`sd2_adj') /*
*/ `options'
}
if "`sd2'" == "" {
di in gr " relative efficiency = " in ye %8.3f /*
*/(`sd_r')^-2 _n /*
*/ in gr " adjustment to sd = " in ye %8.3f /*
*/ `sd_r' _n /*
*/ in gr " adjusted sd1 = " in ye %8.3f /*
*/ `sd1_adj' _n
qui _SAmpsi `m1' `m2', sd1(`sd1_adj') `options'
}
if "$S_5"=="sample" {
di in gr " Estimated required sample sizes:"
if index("`options'", "onesam") == 0 {
di in gr _col(19) "n1 = " in ye %8.0f $S_1
di in gr _col(19) "n2 = " in ye %8.0f $S_2
}
if index("`options'", "onesam") ~= 0 {
di in gr _col(19) "n1 = " in ye %8.0f $S_1
}
}
else {
di in gr " Estimated power:"
di in gr " power = " in ye %8.3f $S_3
}
if "`method'" == "all" & `pre' == 0 {
di in gr _n "method(change) and method(ancova) may " /*
*/ "only be used with baseline measurements"
}
global S_4 = `sd_r'
global S_5
return scalar adj = `sd_r'
return scalar power = $S_3
return scalar N_2 = $S_2
return scalar N_1 = $S_1
}
/* method(change) */
if "`method'" == "change" | ("`method'" == "all" & `pre' >=1 ) {
/* calculate sd ratio */
di _n in gr "Method:" in ye " CHANGE"
local sd_r = (((1 + (`post' - 1) * `r1')/`post') + /*
*/ ((1 + (`pre'-1) * `r0')/`pre') - 2*`r01')^.5
local sd1_adj = `sd1'*`sd_r'
if "`sd2'" ~= "" {
local sd2_adj = `sd2'*`sd_r'
di in gr " relative efficiency = " in ye %8.3f /*
*/(`sd_r')^-2 _n /*
*/ in gr " adjustment to sd = " in ye %8.3f /*
*/ `sd_r' _n /*
*/ in gr " adjusted sd1 = " in ye %8.3f /*
*/ `sd1_adj' _n /*
*/ in gr " adjusted sd2 = " in ye %8.3f /*
*/ `sd2_adj' _n
qui _SAmpsi `m1' `m2', sd1(`sd1_adj') sd2(`sd2_adj') /*
*/ `options'
}
if "`sd2'" == "" {
di in gr " relative efficiency = " in ye %8.3f /*
*/(`sd_r')^-2 _n /*
*/ in gr " adjustment to sd = " in ye %8.3f /*
*/ `sd_r' _n /*
*/ in gr " adjusted sd1 = " in ye %8.3f /*
*/ `sd1_adj' _n
qui _SAmpsi `m1' `m2', sd1(`sd1_adj') `options'
}
if "$S_5"=="sample" {
di in gr " Estimated required sample sizes:"
if index("`options'", "onesam") == 0 {
di in gr _col(19) "n1 = " in ye %8.0f $S_1
di in gr _col(19) "n2 = " in ye %8.0f $S_2
}
if index("`options'", "onesam") ~= 0 {
di in gr _col(19) "n1 = " in ye %8.0f $S_1
}
}
else {
di in gr " Estimated power:"
di in gr " power = " in ye %8.3f $S_3
}
global S_4 = `sd_r'
global S_5
return scalar adj = `sd_r'
return scalar power = $S_3
return scalar N_2 = $S_2
return scalar N_1 = $S_1
}
/* method(ancova) */
if "`method'" == "ancova" | ("`method'" == "all" & `pre' >=1 ) {
/* calculate sd1_adj */
di _n in gr "Method:" in ye " ANCOVA"
local sd_r = ((((1 + (`post' - 1) * `r1')/`post') /*
*/ -((`r01')^2)*`pre'/(1 +(`pre'-1)*`r0')))^.5
local sd1_adj = `sd1'*`sd_r'
if "`sd2'" ~= "" {
local sd2_adj = `sd2'*`sd_r'
di in gr " relative efficiency = " in ye %8.3f /*
*/(`sd_r')^-2 _n /*
*/ in gr " adjustment to sd = " in ye %8.3f /*
*/ `sd_r' _n /*
*/ in gr " adjusted sd1 = " in ye %8.3f /*
*/ `sd1_adj' _n /*
*/ in gr " adjusted sd2 = " in ye %8.3f /*
*/ `sd2_adj' _n
qui _SAmpsi `m1' `m2', sd1(`sd1_adj') sd2(`sd2_adj') /*
*/ `options'
}
if "`sd2'" == "" {
di in gr " relative efficiency = " in ye %8.3f /*
*/(`sd_r')^-2 _n /*
*/ in gr " adjustment to sd = " in ye %8.3f /*
*/ `sd_r' _n /*
*/ in gr " adjusted sd1 = " in ye %8.3f /*
*/ `sd1_adj' _n
qui _SAmpsi `m1' `m2', sd1(`sd1_adj') `options'
}
if "$S_5"=="sample" {
di in gr " Estimated required sample sizes:"
if index("`options'", "onesam") == 0 {
di in gr _col(19) "n1 = " in ye %8.0f $S_1
di in gr _col(19) "n2 = " in ye %8.0f $S_2
}
if index("`options'", "onesam") ~= 0 {
di in gr _col(19) "n1 = " in ye %8.0f $S_1
}
}
else {
di in gr " Estimated power:"
di in gr " power = " in ye %8.3f $S_3
}
global S_4 = `sd_r'
global S_5
return scalar adj = `sd_r'
return scalar power = $S_3
return scalar N_2 = $S_2
return scalar N_1 = $S_1
}
end
program define _SAmpsi, rclass
gettoken m1 0 : 0, parse(" ,")
gettoken m2 0 : 0, parse(" ,")
confirm number `m1'
confirm number `m2'
local dalpha = 1 - $S_level/100
syntax [, Alpha(real `dalpha') Power(real 0.90) N1(int 0) N2(int 0) /*
*/ SD1(real 0) SD2(real 0) Ratio(str) ONESAMple ONESIDed noCONTinuity]
if "`onesamp'"~=""&"`ratio'" ~=""{
di in red "options r() and onesample " /*
*/ "are incompatible"
exit 198
}
if "`ratio'"~=""{
confirm number `ratio'
}
else{
local ratio = 1
}
if `alpha'<=0 | `alpha'>=1 {
di in red "alpha() out of range"
exit 198
}
if `power'<=0 | `power'>=1 {
di in red "power() out of range"
exit 198
}
if `sd1'<0 | `sd2'<0 {
di in red "sd() out of range"
exit 198
}
if ("`continuity'"~="")&(`sd1'~=0 |`sd2'~=0 |"`onesample'"~=""){
di in red "option `continuity' not allowed"
exit 198
}
if `ratio'<=0{
di in red "ratio() out of range"
exit 198
}
if `n1'<0 | `n2'<0 {
di in red "n() out of range"
exit 198
}
tempname diff n0 pbar r1 w w1 w2 za zb
scalar `diff' = abs(`m1' - `m2')
scalar `w1' = `m1'*(1 - `m1')
scalar `w2' = `m2'*(1 - `m2')
if `sd1' == 0 & `sd2' == 0 & (`w1' < 0 | `w2' < 0) {
di in red "if testing means, then sd(#) must be specified" /*
*/ _n "if testing proportions, the proportions " /*
*/ "must be between 0 and 1"
exit 499
}
if `sd1' ~= 0 & `sd2' ~= 0 & "`onesamp'"~="" {
di in red "for one-sample comparison of mean, " /*
*/ "only one sd(#) can be specified"
exit 499
}
if "`oneside'" ~= "" { scalar `za' = invnorm(1 - `alpha') }
else { scalar `za' = invnorm(1 - `alpha'/2) }
if `n1' == 0 & `n2' == 0 { /* compute sample size */
scalar `zb' = invnorm(`power')
if `sd1' ~= 0 | `sd2' ~= 0 { /* means */
scalar `w' = ((`za'+`zb')/`diff')^2
if `sd1' == 0 { local sd1 = `sd2' }
if "`onesamp'"~="" { /* one sample */
local n1 = `w'*(`sd1')^2
if `n1' ~= int(`n1') {
local n1 = int(`n1' + 1)
}
di _n in gr /*
*/ "Estimated sample size for one-sample " /*
*/ "comparison of mean" _n /*
*/ " to hypothesized value" _n(2) /*
*/ "Test Ho: m = " in ye %6.0g `m1' in gr /*
*/ ", where m is the mean in the population" /*
*/ _n(2) "Assumptions:" _n(2) _col(10) /*
*/ "alpha = " in ye %8.4f `alpha' _c
if "`oneside'"~="" {
di in gr " (one-sided)"
}
else {
di in gr " (two-sided)"
}
di _col(10) in gr "power = " in ye %8.4f /*
*/ `power' _n in gr " alternative m = " /*
*/ in ye %8.0g `m2' _n in gr _col(13) "sd = " /*
*/ in ye %8.0g `sd1' _n(2) in gr /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -