qnormR {DPQ} | R Documentation |
qnorm()
with Diagnostics and Tuning ParametersCompute's R level implementations of R's qnorm()
as
implemented in C code (in R's ‘mathlib’).
qnormR1(p, mu = 0, sd = 1, lower.tail = TRUE, log.p = FALSE, trace = 0, version = ) qnormR (p, mu = 0, sd = 1, lower.tail = TRUE, log.p = FALSE, trace = 0, version = c("4.0.x", "2020-10-17"))
p |
probability p, 1-p, or \log(p),
\log(1-p), depending on |
mu |
mean of the normal distribution. |
sd |
standard deviation of the normal distribution. |
lower.tail, log.p |
logical, see, e.g., |
trace |
logical or integer; if positive or |
version |
a |
For qnormR1(p, ..)
, p
must be of length one, whereas
qnormR(p, m, s, ..)
works vectorized in p
, mu
, and
sd
. In the DPQ package source, it simply the result of
Vectorize(qnormR1, ...)
.
a numeric vector like the input q
.
Martin Maechler
qR <- curve(qnormR, n = 2^11) abline(h=0, v=0:1, lty=3, col=adjustcolor(1, 1/2)) with(qR, all.equal(y, qnorm(x), tol=0)) # currently shows TRUE with(qR, all.equal(pnorm(y), x, tol=0)) # currently: mean rel. diff.: 2e-16 stopifnot(with(qR, all.equal(pnorm(y), x, tol = 1e-14))) ## Showing why/where R's qnorm() was poor up to 2020: log.p=TRUE extreme tail qs <- 2^seq(0, 155, by=1/8) lp <- pnorm(qs, lower.tail=FALSE, log.p=TRUE) ## the inverse of pnorm() fails BADLY for extreme tails; this identical to qnorm(..) in R <= 4.0.x: qp <- qnormR(lp, lower.tail=FALSE, log.p=TRUE, version="4.0.x") ## asymptotically correct approximation : qpA <- sqrt(- 2* lp) ##^ col2 <- c("black", adjustcolor(2, 0.6)) col3 <- c(col2, adjustcolor(4, 0.6)) ## instead of going toward infinity, it converges at 9.834030e+07 : matplot(-lp, cbind(qs, qp, qpA), type="l", log="xy", lwd = c(1,1,3), col=col3, main = "Poorness of qnorm(lp, lower.tail=FALSE, log.p=TRUE)", ylab = "qnorm(lp, ..)", axes=FALSE) sfsmisc::eaxis(1); sfsmisc::eaxis(2) legend("top", c("truth", "qnorm(.) = qnormR(., \"4.0.x\")", "asymp. approx"), lwd=c(1,1,3), lty=1:3, col=col3, bty="n") rM <- cbind(lp, qs, 1 - cbind(relE.qnorm=qp, relE.approx=qpA)/qs) rM[ which(1:nrow(rM) %% 20 == 1) ,]