RNDAT
Generates pseudorandom numbers from a multivariate distribution determined from a given sample.
Required Arguments
X — NSAMP by K matrix containing the given sample. (Input/Output)
If IDO = 0 or 1, on output the rows of X are rearranged by routine QUADT to form a k‑d tree.
NN — Number of nearest neighbors of the randomly selected point in X that are used to form the output point in R. (Input)
R — NR by K matrix containing the random multivariate vectors in its rows. (Output)
Optional Arguments
IDO — Generator option. (Input)
Default: IDO = 0.
IDO |
Action |
0 |
This is the only invocation of RNDAT with the sample in X and all desired pseudorandom numbers are to be generated in this call. |
1 |
This is the first invocation, and additional calls to RNDAT will be made to generate additional random numbers using the same given sample. |
2 |
This is an intermediate invocation of RNDAT. The work vectors have been set up in a previous call, but they are not to be released because additional calls will be made. |
3 |
This is the final invocation of RNDAT. The work vectors have been set up in a previous call and they are to be released. |
NR — Number of random multivariate vectors to generate. (Input)
If NR = 0, only initialization or wrap up operations are performed. (This would make sense only if IDO = 1 or 3.)
Default: NR = size (R,1).
K — The length of the multivariate vectors, that is, the number of dimensions. (Input)
Default: K = size (R,2).
NSAMP — Number of given data points from the distribution to be simulated. (Input)
Default: NSAMP = size (X,1).
LDX — Leading dimension of X exactly as specified in the dimension statement in the calling program. (Input)
Default: LDX = size (X,1).
LDR — Leading dimension of R exactly as specified in the dimension statement of the calling program. (Input)
Default: LDR = size (R,1).
FORTRAN 90 Interface
Generic: CALL RNDAT (X, NN, R [, …])
Specific: The specific interface names are S_RNDAT and D_RNDAT.
FORTRAN 77 Interface
Single: CALL RNDAT (IDO, NR, K, NSAMP, X, LDX, NN, R, LDR)
Double: The double precision name is DRNDAT.
Description
Given a sample of size n (= NSAMP) of observations of a k‑variate random variable, RNDAT generates a pseudorandom sample with approximately the same moments as the given sample. The sample obtained is essentially the same as if sampling from a Gaussian kernel estimate of the sample density. (See Thompson 1989.) Routine RNDAT uses methods described by Taylor and Thompson (1986).
Assume that the (vector‑valued) observations xi are in the rows of X. An observation, xj, is chosen randomly; its nearest m (= NN) neighbors,
are determined; and the mean
of those nearest neighbors is calculated. Next, a random sample
u1, u2, …, um is generated from a uniform distribution with lower bound
and upper bound
The random variate delivered is
The process is then repeated until NR such simulated variates are generated and stored in the rows of R.
When RNDAT is invoked for the first time for a given sample, a search tree is computed for the rows of X. During the generation process, this tree is used to find the nearest neighbors of the randomly selected row. The argument IDO is used to determine whether or not the tree must be computed and whether workspace has to be allocated to store the tree.
Comments
1. Workspace may be explicitly provided, if desired, by use of R2DAT/DR2DAT. The reference is:
CALL R2DAT (IDO, NR, K, NSAMP, X, LDX, NN, R, LDR, IWK, WK)
The additional arguments are as follows:
IWK — Work vector of length equal to 2 * NSAMP + 3 * LEN + K + NN.
WK — Work vector of length equal to 2 * NSAMP + 2 * K * LEN + K + 2 * NN.
R2DAT allows alternating calls for two different populations (see Comment 3). Warning: R2DAT does no error checking.
2. The rows of X are rearranged on output from either RNDAT or R2DAT.
3. When more than one call is to be made to RNDAT to generate more than one R matrix using the same sample in X, IDO should be set to 1 for the first call, to 2 for all subsequent calls except the last one, and to 3 for the last call. If more than one population is to be simulated (that is, there is more than one sample, X), it is necessary to generate all of the observations from each population at one time because data is stored in the work vectors. If the user provides work vectors for each population to be simulated, R2DAT can be used to simulate different population alternatively.
4. The routine RNSET can be used to initialize the seed of the random number generator. The routine RNOPT can be used to select the form of the generator.
Example
In this example, RNDAT is used to generate 5 pseudorandom vectors of length 4 using the initial and final systolic pressure and the initial and final diastolic pressure from Data Set A in Afifi and Azen (1979) as the fixed sample from the population to be modeled. (Values of these four variables are in the seventh, tenth, twenty‑first, and twenty‑fourth columns of data set number nine in routine GDATA).
USE IMSL_LIBRARIES
IMPLICIT NONE
INTEGER LDR, LDRDAT, LDX, NDR, NDRDAT, NDX
PARAMETER (LDR=5, LDRDAT=113, LDX=113, NDR=4, NDRDAT=34, NDX=4)
!
INTEGER ISEED, NN, NRCOL, NRROW
REAL R(LDR,NDR), RDATA(LDRDAT,NDRDAT), X(LDX,NDX)
CHARACTER * 6 NUMBER(1)
! Afifi and Azen Data Set A
DATA NUMBER(1)/'NUMBER'/
CALL GDATA (9, RDATA, NRROW, NRCOL)
CALL SCOPY (NRROW, RDATA(1:,7), 1, X(1:,1), 1)
CALL SCOPY (NRROW, RDATA(1:,10), 1, X(1:,2), 1)
CALL SCOPY (NRROW, RDATA(1:,21), 1, X(1:,3), 1)
CALL SCOPY (NRROW, RDATA(1:,24), 1, X(1:,4), 1)
!
ISEED = 123457
CALL RNSET (ISEED)
! Set input values
NN = 5
! Generate random variates
CALL RNDAT (X, NN, R)
! Print results
CALL WRRRL ('Random variates', R, NUMBER, NUMBER, FMT='(F15.4)')
!
END
Output
Random variates
1 2 3 4
1 162.7668 90.5057 153.7173 104.8768
2 153.3533 78.3180 176.6643 85.2155
3 93.6958 48.1675 153.5495 71.3688
4 101.7508 54.1855 113.1215 56.2916
5 91.7403 58.7684 48.4368 28.0994