[Rd] package mvtnorm: sigma parameter in pmvnorm() (PR#2478)
ligges@statistik.uni-dortmund.de
ligges@statistik.uni-dortmund.de
Tue Jan 21 09:49:10 2003
jerome@hivnet.ubc.ca wrote:
> Full_Name: Jerome Asselin
> Version: 1.6.2
> OS: RedHat Linux 7.2
> Submission from: (NULL) (142.103.173.179)
>
>
>
> pmvnorm() may fail for a univariate distribution when
> its parameter "sigma" is defined as a matrix. It will
> fail if sigma < 1.
>
> library(mvtnorm)
>
> #THIS WORKS
>
>>pmvnorm(lower=-Inf,upper=2,mean=0,sigma=matrix(1.5))
>
> [1] 0.9487648
> attr(,"error")
> [1] 0
> attr(,"msg")
> [1] "univariate: using pnorm"
>
> #THIS FAILS
>
>>pmvnorm(lower=-Inf,upper=2,mean=0,sigma=matrix(.5))
>
> Error in checkmvArgs(lower = lower, upper = upper, mean = mean, corr = corr, :
> diag(sigma) and lower are of different length
>
> #THIS WORKS
>
>>pmvnorm(lower=-Inf,upper=2,mean=0,sigma=.5)
>
> [1] 0.9976611
> attr(,"error")
> [1] 0
> attr(,"msg")
> [1] "univariate: using pnorm"
The bug is in checkmvArgs():
if (!is.null(sigma)) {
if (!is.matrix(sigma)) {
if (length(sigma) == 1)
UNI <- TRUE
if (length(sigma) != length(lower))
stop("diag(sigma) and lower are of different length")
} else {
+ if (length(diag(sigma)) != length(lower))
+ stop("diag(sigma) and lower are of different length")
if (length(sigma) == 1) {
UNI <- TRUE
sigma <- sigma[1,1]
}
- if (length(diag(sigma)) != length(lower))
- stop("diag(sigma) and lower are of different length")
}
}
The fix is to change the position of the validation, i.e. before the
matrix is coerced to a vector of length 1.
Uwe Ligges