View source: R/SKAT_TruncatedNormalCEPSolve.R
1 | SKAT_TruncatedNormalCEPSolve(formula, c1, c2, delta = 0.001, gamma0 = "default", MAXITERNUM = 20, data = NULL)
|
formula |
|
c1 |
|
c2 |
|
delta |
|
gamma0 |
|
MAXITERNUM |
|
data |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | ##---- Should be DIRECTLY executable !! ----
##-- ==> Define data, use random,
##-- or do help(data=index) for the standard data sets.
## The function is currently defined as
function (formula, c1, c2, delta = 0.001, gamma0 = "default",
MAXITERNUM = 20, data = NULL)
{
preerror = 0
X <- model.matrix(formula, data = data)
Y <- model.frame(formula, data = data)[, 1]
if (is.character(gamma0) && gamma0 == "default") {
out.lm <- lm(formula, data = data)
sigma.ols = mean(abs(out.lm$residuals))
c = (c1 - c2)/2
gamma0 = c(out.lm$coefficients, sigma.ols)
}
n = nrow(X)
K = ncol(X)
iternum = 0
sigma = gamma0[K + 1]
alpha0 = gamma0[-(K + 1)]
while (T) {
Xa = (X %*% alpha0)[, 1]
J = matrix(0, nrow = K, ncol = K)
a1 <- (c1 - Xa)/sigma
a2 <- (c2 - Xa)/sigma
f1 <- dnorm(a1)
f2 <- dnorm(a2)
F1 <- pnorm(a1)
F2 <- pnorm(a2)
Y_Xa <- (Y - Xa)
f12 <- f1 - f2
F12 <- F2 + 1 - F1
J[1:K, 1:K] <- t(X) %*% (X * (-1 + (a2 * f2 - a1 * f1)/F12 +
(f12/F12)^2))/sigma^2
Jinv = solve(J)
V = matrix(0, nrow = K, ncol = 1)
V[1:K, 1] = colSums((X/sigma) * (Y_Xa/sigma - f12/F12))
sigma_next = uniroot(function(sigmaT) sum(-1/sigmaT +
(Y_Xa)^2/sigmaT^3 + ((a2/sigmaT) * f2 - ((c1 - X %*%
alpha0)/sigmaT^2) * f1)/F12), c(sigma/20, 10 * sigma))$root
alphaNext = alpha0 - Jinv %*% V
iternum = iternum + 1
curerror = sum(abs(alphaNext - alpha0)) + abs(sigma -
sigma_next)
if (iternum > MAXITERNUM && curerror > preerror) {
stop("Newton-Raphson diverging. Try different initial guess for gamma0.")
}
preerror = curerror
if (curerror < delta) {
end = TRUE
if (end) {
MLEs = c(alphaNext, sigma)
MLEs = data.frame(MLEs)
rownames = rep(0, K + 1)
for (i in 1:K) {
rownames[i] = paste("alpha", i - 1, sep = "")
}
rownames[1] = "intercept"
rownames[K + 1] = "sigma"
row.names(MLEs) = rownames
alpha0 = alphaNext
Xa = (X %*% alpha0)[, 1]
re <- SKAT_TruncatedNormalCEP_Get_Moment(c1,
c2, sigma, Xa)
return(list(coef = MLEs, M = re$M, V = re$V,
W = re$W, Mu = re$Mu, Y = Y, X1 = X, sigma = sigma,
Xa = Xa))
}
}
alpha0 = alphaNext
sigma = sigma_next
}
}
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.