find_constants {SimMultiCorrData} | R Documentation |
Find Power Method Transformation Constants
Description
This function calculates Fleishman's third or Headrick's fifth-order constants necessary to transform a standard normal
random variable into a continuous variable with the specified skewness, standardized kurtosis, and standardized
fifth and sixth cumulants. It uses multiStart
to find solutions to fleish
or
nleqslv
for poly
. Multiple starting values are used to ensure the correct
solution is found. If not user-specified and method
= "Polynomial", the cumulant values are checked to see if they fall in
Headrick's Table 1 (2002, p.691-2, doi: 10.1016/S0167-9473(02)00072-5) of common distributions (see Headrick.dist
).
If so, his solutions are used as starting values. Otherwise, a set of n
values randomly generated from uniform distributions is used to
determine the power method constants.
Each set of constants is checked for a positive correlation with the underlying normal variable (using
power_norm_corr
)
and a valid power method pdf (using pdf_check
). If the correlation is <= 0, the signs of c1 and c3 are
reversed (for method
= "Fleishman"), or c1, c3, and c5 (for method
= "Polynomial"). These sign changes have no effect on the cumulants
of the resulting distribution. If only invalid pdf constants are found and a vector of sixth cumulant correction values (Six
) is provided,
each is checked for valid pdf constants. The smallest correction that generates a valid power method pdf is used. If valid pdf constants
still can not be found, the original invalid pdf constants (calculated without a sixth cumulant correction) will be provided if they exist.
If not, the invalid pdf constants calculated with the sixth cumulant correction will be provided. If no solutions
can be found, an error is given and the result is NULL.
Usage
find_constants(method = c("Fleishman", "Polynomial"), skews = NULL,
skurts = NULL, fifths = NULL, sixths = NULL, Six = NULL,
cstart = NULL, n = 25, seed = 1234)
Arguments
method |
the method used to find the constants. "Fleishman" uses a third-order polynomial transformation and requires skewness and standardized kurtosis inputs. "Polynomial" uses Headrick's fifth-order transformation and requires all four standardized cumulants. |
skews |
the skewness value |
skurts |
the standardized kurtosis value (kurtosis - 3, so that normal variables have a value of 0) |
fifths |
the standardized fifth cumulant (if |
sixths |
the standardized sixth cumulant (if |
Six |
a vector of correction values to add to the sixth cumulant if no valid pdf constants are found,
ex: |
cstart |
initial value for root-solving algorithm (see |
n |
the number of initial starting values to use with root-solver. More starting values require more calculation time (default = 25). |
seed |
the seed value for random starting value generation (default = 1234) |
Value
A list with components:
constants
a vector of valid or invalid power method solutions, c("c0","c1","c2","c3") for method
= "Fleishman" or
c("c0","c1","c2","c3","c4,"c5") for method
= "Polynomial"
valid
"TRUE" if the constants produce a valid power method pdf, else "FALSE"
SixCorr1
if Six
is specified, the sixth cumulant correction required to achieve a valid pdf
Reasons for Function Errors
1) The most likely cause for function errors is that no solutions to fleish
or
poly
converged when using find_constants
. If this happens,
the simulation will stop. Possible solutions include: a) increasing the number of initial starting values (n
),
b) using a different seed, or c) specifying a Six
vector of sixth cumulant correction values (for method
= "Polynomial").
If the standardized cumulants are obtained from calc_theory
, the user may need to use rounded values as inputs (i.e.
skews = round(skews, 8)
). Due to the nature of the integration involved in calc_theory
, the results are
approximations. Greater accuracy can be achieved by increasing the number of subdivisions (sub
) used in the integration
process. For example, in order to ensure that skew is exactly 0 for symmetric distributions.
2) In addition, the kurtosis may be outside the region of possible values. There is an associated lower boundary for kurtosis associated
with a given skew (for Fleishman's method) or skew and fifth and sixth cumulants (for Headrick's method). Use
calc_lower_skurt
to determine the boundary for a given set of cumulants.
References
Fleishman AI (1978). A Method for Simulating Non-normal Distributions. Psychometrika, 43, 521-532. doi: 10.1007/BF02293811.
Hasselman B (2018). nleqslv: Solve Systems of Nonlinear Equations. R package version 3.3.2. https://CRAN.R-project.org/package=nleqslv
Headrick TC (2002). Fast Fifth-order Polynomial Transforms for Generating Univariate and Multivariate Non-normal Distributions. Computational Statistics & Data Analysis, 40(4):685-711. doi: 10.1016/S0167-9473(02)00072-5. (ScienceDirect)
Headrick TC (2004). On Polynomial Transformations for Simulating Multivariate Nonnormal Distributions. Journal of Modern Applied Statistical Methods, 3(1), 65-71. doi: 10.22237/jmasm/1083370080.
Headrick TC, Kowalchuk RK (2007). The Power Method Transformation: Its Probability Density Function, Distribution Function, and Its Further Use for Fitting Data. Journal of Statistical Computation and Simulation, 77, 229-249. doi: 10.1080/10629360600605065.
Headrick TC, Sawilowsky SS (1999). Simulating Correlated Non-normal Distributions: Extending the Fleishman Power Method. Psychometrika, 64, 25-35. doi: 10.1007/BF02294317.
Headrick TC, Sheng Y, & Hodis FA (2007). Numerical Computing and Graphics for the Power Method Transformation Using Mathematica. Journal of Statistical Software, 19(3), 1 - 17. doi: 10.18637/jss.v019.i03.
Varadhan R, Gilbert P (2009). BB: An R Package for Solving a Large System of Nonlinear Equations and for Optimizing a High-Dimensional Nonlinear Objective Function, J. Statistical Software, 32:4, http://www.jstatsoft.org/v32/i04/
See Also
multiStart
, nleqslv
,
fleish
, poly
,
power_norm_corr
, pdf_check
Examples
# Exponential Distribution
find_constants("Fleishman", 2, 6)
## Not run:
# Compute third-order power method constants.
options(scipen = 999) # turn off scientific notation
# Laplace Distribution
find_constants("Fleishman", 0, 3)
# Compute fifth-order power method constants.
# Logistic Distribution
find_constants(method = "Polynomial", skews = 0, skurts = 6/5, fifths = 0,
sixths = 48/7)
# with correction to sixth cumulant
find_constants(method = "Polynomial", skews = 0, skurts = 6/5, fifths = 0,
sixths = 48/7, Six = seq(1.7, 2, by = 0.01))
## End(Not run)