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.
199 lines
5.5 KiB
Plaintext
199 lines
5.5 KiB
Plaintext
7 months ago
|
*! version 1.0.1 TJS 9jun2000
|
||
|
program define nctprob, rclass
|
||
|
version 6.0
|
||
|
args t delta df extra
|
||
|
|
||
|
if "`df'" == "" | "`extra'" != "" {
|
||
|
di in gr "Syntax for " in wh "nctprob" _c
|
||
|
di in gr ", the cumulative non-central t"
|
||
|
di in gr "distribution from negative infinity to t', is: " _n
|
||
|
di in wh " nctprob " in gr "t' delta df" _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 " df " in gr "is the degrees of freedom" _n
|
||
|
di in wh " nctprob " in gr "computes " in wh "p" _c
|
||
|
di in gr " such that P(t<=" in wh "t'" in gr "| " in wh "delta" _c
|
||
|
di in gr ", " in wh "df" in gr ") = " in wh "p"
|
||
|
di in gr " and returns the value in result " _c
|
||
|
di in wh "r(p) " in gr "and global " in wh "S_1" in gr "."
|
||
|
global S_1 = .
|
||
|
return scalar p = .
|
||
|
exit 9
|
||
|
}
|
||
|
|
||
|
if `df' != int(`df') | `df' < 1 {
|
||
|
di in re "degrees of freedom must be a positive integer"
|
||
|
global S_1 = .
|
||
|
return scalar p = .
|
||
|
exit 498
|
||
|
}
|
||
|
|
||
|
local even = mod(`df',2) == 0
|
||
|
|
||
|
/* numerical calculation of C(h,a) requires -preserve-
|
||
|
but C(h,a) is only needed for odd df's */
|
||
|
if !`even' { preserve }
|
||
|
|
||
|
tempname A B h a p C M0 M1 M2 ak Mo Me k Mk
|
||
|
tempvar x y
|
||
|
|
||
|
scalar `A' = `t' / sqrt(`df')
|
||
|
scalar `B' = `df' / (`df' + (`t')^2)
|
||
|
scalar `h' = `delta' * sqrt(`B')
|
||
|
|
||
|
if `even' { scalar `p' = normprob(-(`delta')) }
|
||
|
else {
|
||
|
scalar `p' = normprob(-(`delta' * sqrt(`B')))
|
||
|
scalar `a' = abs(`A')
|
||
|
qui range `x' 0 `a' 1001
|
||
|
gen `y' = exp(-((`h')^2 / 2) * (1 + (`x')^2)) / (1 + (`x')^2)
|
||
|
qui integ `y' `x'
|
||
|
scalar `C' = r(integral)/ (2 * _pi)
|
||
|
scalar `p' = `p' + 2 * `C' * sign(`A')
|
||
|
}
|
||
|
if `df' == 1 {
|
||
|
di _n in gr " p =" in ye %10.6f `p'
|
||
|
di _n in gr " P(t <= " `t' " | delta = " _c
|
||
|
di in gr `delta' ", df = " `df' _c
|
||
|
di in gr ") = " in ye `p'
|
||
|
global S_1 = `p'
|
||
|
return scalar p = `p'
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
scalar `M0' = `A' * sqrt(`B') * normd(`delta' * sqrt(`B'))
|
||
|
scalar `M0' = `M0' * normprob(`delta' * `A' * sqrt(`B'))
|
||
|
if `df' == 2 {
|
||
|
scalar `p' = `p' + sqrt(2 * _pi) * `M0'
|
||
|
di _n in gr " p =" in ye %10.6f `p'
|
||
|
di _n in gr " P(t <= " `t' " | delta = " _c
|
||
|
di in gr `delta' ", df = " `df' _c
|
||
|
di in gr ") = " in ye `p'
|
||
|
global S_1 = `p'
|
||
|
return scalar p = `p'
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
scalar `M1' = `A' * normd(`delta') / sqrt(2 * _pi)
|
||
|
scalar `M1' = `B' * (`delta' * `A' * `M0' + `M1')
|
||
|
if `df' == 3 {
|
||
|
scalar `p' = `p' + 2 * `M1'
|
||
|
di _n in gr " p =" in ye %10.6f `p'
|
||
|
di _n in gr " P(t <= " `t' " | delta = " _c
|
||
|
di in gr `delta' ", df = " `df' _c
|
||
|
di in gr ") = " in ye `p'
|
||
|
global S_1 = `p'
|
||
|
return scalar p = `p'
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
scalar `M2' = `B' * ( `delta' * `A' * `M1' + `M0') / 2
|
||
|
if `df' == 4 {
|
||
|
scalar `p' = `p' + sqrt(2 * _pi) * (`M0' + `M2')
|
||
|
di _n in gr " p =" in ye %10.6f `p'
|
||
|
di _n in gr " P(t <= " `t' " | delta = " _c
|
||
|
di in gr `delta' ", df = " `df' _c
|
||
|
di in gr ") = " in ye `p'
|
||
|
global S_1 = `p'
|
||
|
return scalar p = `p'
|
||
|
exit
|
||
|
}
|
||
|
|
||
|
* calculate Mk's for k = 3 to `df'-2 and sum odds and evens
|
||
|
scalar `ak' = 1
|
||
|
scalar `Mo' = `M1'
|
||
|
scalar `Me' = `M0' + `M2'
|
||
|
scalar `k' = 3
|
||
|
while `k' <= `df' - 2 {
|
||
|
scalar `ak' = 1 / ((`k' - 2) * `ak')
|
||
|
scalar `Mk' = `ak' * `delta' * `A' * `M2' + `M1'
|
||
|
scalar `Mk' = (`k'-1) * `B' * `Mk' / `k'
|
||
|
if mod(`k',2) == 0 { scalar `Me' = `Me' + `Mk' }
|
||
|
else { scalar `Mo' = `Mo' + `Mk' }
|
||
|
scalar `M1' = `M2'
|
||
|
scalar `M2' = `Mk'
|
||
|
scalar `k' = `k' + 1
|
||
|
}
|
||
|
if `even' { scalar `p' = `p' + sqrt(2 * _pi) * `Me' }
|
||
|
else { scalar `p' = `p' + 2 * `Mo' }
|
||
|
|
||
|
di _n in gr " p =" in ye %10.6f `p'
|
||
|
di _n in gr " P(t <= " `t' " | delta = " _c
|
||
|
di in gr `delta' ", df = " `df' _c
|
||
|
di in gr ") = " in ye `p'
|
||
|
|
||
|
global S_1 = `p'
|
||
|
return scalar p = `p'
|
||
|
|
||
|
exit
|
||
|
end
|
||
|
|
||
|
/* ------------------------------------------------------------
|
||
|
|
||
|
Note: formula implemented above is from
|
||
|
D. B. Owen (Technometrics 10(3):445-478, 1968)
|
||
|
|
||
|
|
||
|
Let
|
||
|
t be the observed t-value
|
||
|
d be the non-centrality parameter
|
||
|
v be the degrees of freedom
|
||
|
|
||
|
G(z) be the cumulative standard Normal distribution
|
||
|
G'(z) be the standard Normal density function
|
||
|
|
||
|
Define
|
||
|
|
||
|
A = t / sqrt(v)
|
||
|
|
||
|
B = v / (v + t^2)
|
||
|
|
||
|
then
|
||
|
|
||
|
M = 0
|
||
|
-1
|
||
|
|
||
|
M = A * sqrt(B) * G'(d * sqrt(B)) * G(d * A * sqrt(B))
|
||
|
0
|
||
|
|
||
|
M = B * [ d * A * M + A * G'(d) / sqrt(2 * pi)]
|
||
|
1 0
|
||
|
|
||
|
M = B * [ d * A * M + M ]
|
||
|
2 0 1
|
||
|
|
||
|
and, for k>= 3,
|
||
|
|
||
|
M = (k - 1) * B * [ a * d * A * M + M ] / k
|
||
|
k k k-1 k-2
|
||
|
|
||
|
where a = 1 / [(k - 2) * a ] and a = 1
|
||
|
k k-1 2
|
||
|
|
||
|
|
||
|
Finally, for even df's,
|
||
|
|
||
|
P{T <= t | d, v} =
|
||
|
G(-d) + sqrt(2 * pi) * [M + M + ... + M ]
|
||
|
0 2 v-2
|
||
|
|
||
|
and for odd df's,
|
||
|
|
||
|
P{T <= t | d, v} =
|
||
|
G(-d * sqrt(B)) + 2 * C(d * sqrt(B), A) + 2 * [M + M + ... + M ]
|
||
|
1 3 v-2
|
||
|
|
||
|
|
||
|
where
|
||
|
abs(a)
|
||
|
1 / exp[-h^2 / 2 * (1 + x^2)]
|
||
|
C(h,a) = sign(a) -------- | --------------------------- dx
|
||
|
2 * pi / 1 + x^2
|
||
|
x=0
|
||
|
|
||
|
|
||
|
Note: integral C(h,a) is computed numerically in this program.
|
||
|
|
||
|
------------------------------------------------------------ */
|
||
|
|