You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.2 KiB
Plaintext

*! version 1.0.0 TJS 9jun2000
program define nctn, rclass
version 6.0
args t delta p st
if "`st'" != "step" {local star "*"}
if lower("`st'") == "z" { local zstar " "}
else {local zstar "*"}
if "`p'" == "" {
di in gr "Syntax for " in wh "nctn" in gr " is:" _n
di in wh " nctn " in gr "t' delta p" _n
di in gr " where " in wh "t' " in gr "is the observed t"
di in wh " delta " in gr "is the noncentrality parameter"
di in wh " p " in gr "is the probability" _n
di in wh " nctn " in gr "computes the minimum " in wh "n" _c
di in gr " such that, for " in wh "df " in gr "= " in wh "n" _c
di in gr " - 1, "
di in gr " when " in wh "p" in gr " < 0.5," _c
di in gr " P(t<=" in wh "t'" in gr "|" in wh "delta" _c
di in gr ", " in wh "df" in gr ") <= " in wh "p" in gr ", and "
di in gr " when " in wh "p" in gr " > 0.5," _c
di in gr " 1 - P(t<=" in wh "t'" in gr "|" in wh "delta" _c
di in gr ", " in wh "df" in gr ") <= " in wh "p" in gr "." _n
di in gr " The minimum " in wh "n" in gr " is returned in result " _c
di in wh "r(n) " in gr "and global " in wh "S_1" in gr "."
global S_1 = .
return scalar n = .
exit 9
}
capture which nctprob
if _rc == 111 {
di in re "nctn requires installation of program nctprob."
di in wh " (contact T. J. Steichen at steicht@rjrt.com for nctprob)."
global S_1 = .
return scalar n = .
exit 111
}
local z = `t' - `delta'
qui nctprob `t' `delta' 1
local pr = r(p)
local zp = normprob(`z')
`star' di "nctprob(1):" `pr'
`star' di "z(inf):" `zp'
local mn = min(`pr', `zp')
local mx = max(`pr', `zp')
if `mn' > `p' | `mx' < `p' {
di in re "inconsistent parameters, no solution possible"
di in bl "note: permissible range for p given t' and delta is " _c
di in bl %6.4f `mn' " to " %6.4f `mx'
global S_1 = .
return scalar n = .
exit 459
}
`zstar' di in bl "note: if " in wh "p" in bl " = "_c
`zstar' di in ye %6.4f `p' in bl " approaches " _c
`zstar' di in ye %6.4f `zp' in bl " = P(z < " _c
`zstar' di in wh "t'" in bl " - " in wh "delta" in bl "),"
`zstar' di in wh "n " in bl "approaches infinity and " _c
`zstar' di in bl "convergence time increases greatly."
`zstar' global S_1 = .
`zstar' return scalar n = .
`zstar' exit 9
local sign "<"
local df = 1
local pr = 1
qui nctprob `t' `delta' 1
local pr1 = r(p)
qui nctprob `t' `delta' 2
local pr2 = r(p)
if `pr2' > `pr1' {
local sign ">"
local pr = 0
}
local step = int(abs(`zp' - `pr1') / abs(`zp' - `p'))
local df = `step'
local f 0
while `f' == 0 {
qui nctprob `t' `delta' `df'
local pr0 = `pr'
local pr = r(p)
`star' di "df: " `df' " step: " `step' " p: " `pr'
if `p' `sign' `pr' { local df = `df' + `step' }
else {
if `step' == 1 & sign((`pr'-`p')/(`pr0'-`p')) < 0 { local f 1 }
else {
local step = max(1, int(`step' / 2))
local df = `df' - `step'
}
}
}
di in gr "for n = " in ye `df' + 1 in gr ", df = " in ye `df' _c
if `pr' < `p' {
di in gr " and p = " `pr' _c
di in gr " <= " `p' "."
}
else {
di in gr " and 1 - p = " 1 - `pr' _c
di in gr " <= " 1 - `p' " = 1 - " `p' "."
}
global S_1 = `df'
return scalar n = `df'
end