Difference between revisions of "Convest.R"
From Organic Design wiki
m |
(rm comment, tolerance arg was added to examine convergence vs speed) |
||
| (5 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
| − | # {{R}} | + | # ---------------------- Modified convest function ---------------------------- # {{R}} |
| + | # f.hat.diff <- (f.hat.p - f.theta.hat.p) computed for efficiency | ||
| + | # Second redundant pi.0.hat <- f.hat[101] removed | ||
| + | # !--------------------- Modified convest function ---------------------------- # | ||
| + | |||
| + | |||
| + | |||
`convest` <- | `convest` <- | ||
| − | function (p, niter = 100, doplot = FALSE, doreport = FALSE, file="") | + | function (p, niter = 100, doplot = FALSE, doreport = FALSE, file="", tol=1e-06) { |
| − | { | ||
if (!length(p)) | if (!length(p)) | ||
return(NA) | return(NA) | ||
| Line 10: | Line 15: | ||
stop("All p-values must be between 0 and 1") | stop("All p-values must be between 0 and 1") | ||
k <- niter | k <- niter | ||
| − | ny <- | + | ny <- tol |
p <- sort(p) | p <- sort(p) | ||
m <- length(p) | m <- length(p) | ||
| Line 20: | Line 25: | ||
f.hat <- rep(1, 101) | f.hat <- rep(1, 101) | ||
f.hat.p <- rep(1, m) | f.hat.p <- rep(1, m) | ||
| − | theta.hat <- 0.01 * which.max(apply(t.grid.mat, 1, function(theta) sum((2 * | + | |
| − | + | theta.hat <- 0.01 * which.max(apply(t.grid.mat, 1, | |
| + | function(theta) sum((2 * (theta - p) * (p < theta)/theta^2)))) | ||
f.theta.hat <- 2 * (theta.hat - x.grid) * (x.grid < theta.hat)/theta.hat^2 | f.theta.hat <- 2 * (theta.hat - x.grid) * (x.grid < theta.hat)/theta.hat^2 | ||
f.theta.hat.p <- 2 * (theta.hat - p) * (p < theta.hat)/theta.hat^2 | f.theta.hat.p <- 2 * (theta.hat - p) * (p < theta.hat)/theta.hat^2 | ||
| Line 27: | Line 33: | ||
j <- 0 | j <- 0 | ||
thetas <- numeric() | thetas <- numeric() | ||
| − | + | ||
if (doreport == TRUE) { | if (doreport == TRUE) { | ||
| − | cat("j\tpi0\ttheta.hat\t\tepsilon\tD\n", file=file, append= | + | cat("j\tpi0\ttheta.hat\t\tepsilon\tD\n", file=file, append=FALSE) |
} | } | ||
for (j in 1:k) { | for (j in 1:k) { | ||
| Line 41: | Line 47: | ||
eps <- (l + u)/2 | eps <- (l + u)/2 | ||
if (sum((f.hat.diff/((1 - eps) * | if (sum((f.hat.diff/((1 - eps) * | ||
| − | f.hat.p + eps * f.theta.hat.p))[f.hat.p > 0]) < 0) | + | f.hat.p + eps * f.theta.hat.p))[f.hat.p > 0]) < 0) { |
l <- eps | l <- eps | ||
| − | else u <- eps | + | } else { |
| + | u <- eps | ||
| + | } | ||
} | } | ||
} | } | ||
| Line 68: | Line 76: | ||
i <- i + 1 | i <- i + 1 | ||
} | } | ||
| − | + | # pi.0.hat <- f.hat[101] | |
if (doplot == TRUE) { | if (doplot == TRUE) { | ||
plot(x.grid, f.hat, type = "l", main = paste(format(round(pi.0.hat, | plot(x.grid, f.hat, type = "l", main = paste(format(round(pi.0.hat, | ||
Latest revision as of 23:29, 24 June 2007
- ---------------------- Modified convest function ---------------------------- #
Code snipits and programs written in R, S or S-PLUS
- f.hat.diff <- (f.hat.p - f.theta.hat.p) computed for efficiency
- Second redundant pi.0.hat <- f.hat[101] removed
- !--------------------- Modified convest function ---------------------------- #
`convest` <-
function (p, niter = 100, doplot = FALSE, doreport = FALSE, file="", tol=1e-06) {
if (!length(p))
return(NA)
if (any(is.na(p)))
stop("Missing values in p not allowed")
if (any(p < 0 | p > 1))
stop("All p-values must be between 0 and 1")
k <- niter
ny <- tol
p <- sort(p)
m <- length(p)
p.c <- ceiling(100 * p)/100
p.f <- floor(100 * p)/100
t.grid <- (1:100)/100
x.grid <- (0:100)/100
t.grid.mat <- matrix(t.grid, ncol = 1)
f.hat <- rep(1, 101)
f.hat.p <- rep(1, m)
theta.hat <- 0.01 * which.max(apply(t.grid.mat, 1,
function(theta) sum((2 * (theta - p) * (p < theta)/theta^2))))
f.theta.hat <- 2 * (theta.hat - x.grid) * (x.grid < theta.hat)/theta.hat^2
f.theta.hat.p <- 2 * (theta.hat - p) * (p < theta.hat)/theta.hat^2
i <- 1
j <- 0
thetas <- numeric()
if (doreport == TRUE) {
cat("j\tpi0\ttheta.hat\t\tepsilon\tD\n", file=file, append=FALSE)
}
for (j in 1:k) {
f.hat.diff <- (f.hat.p - f.theta.hat.p)
if (sum(f.hat.diff/f.hat.p) > 0)
eps <- 0
else {
l <- 0
u <- 1
while (abs(u - l) > ny) {
eps <- (l + u)/2
if (sum((f.hat.diff/((1 - eps) *
f.hat.p + eps * f.theta.hat.p))[f.hat.p > 0]) < 0) {
l <- eps
} else {
u <- eps
}
}
}
f.hat <- (1 - eps) * f.hat + eps * f.theta.hat
pi.0.hat <- f.hat[101]
d <- sum((f.hat.diff)/f.hat.p)
if (doreport == TRUE) {
cat(j, "\t",pi.0.hat, "\t",theta.hat,"\t",eps, "\t",d, "\n", file=file, append=TRUE)
}
f.hat.p <- 100 * (f.hat[100 * p.f + 1] - f.hat[100 *
p.c + 1]) * (p.c - p) + f.hat[100 * p.c + 1]
theta.hat <- 0.01 * which.max(apply(t.grid.mat, 1, function(theta) sum((2 *
(theta - p) * (p < theta)/theta^2)/f.hat.p)))
f.theta.hat <- 2 * (theta.hat - x.grid) * (x.grid < theta.hat)/theta.hat^2
f.theta.hat.p <- 2 * (theta.hat - p) * (p < theta.hat)/theta.hat^2
if (sum(f.theta.hat.p/f.hat.p) < sum(1/f.hat.p)) {
theta.hat <- 0
f.theta.hat <- rep(1, 101)
f.theta.hat.p <- rep(1, m)
}
if (sum(thetas == theta.hat) == 0) {
thetas[i] <- theta.hat
thetas <- sort(thetas)
i <- i + 1
}
- pi.0.hat <- f.hat[101]
if (doplot == TRUE) {
plot(x.grid, f.hat, type = "l", main = paste(format(round(pi.0.hat,
5), digits = 5)), ylim = c(0, 1.2))
points(thetas, f.hat[100 * thetas + 1], pch = 20,
col = "blue")
}
}
return(pi.0.hat)
}



