Based on a list of pdqr-functions and vector of weights form a pdqr-function for corresponding mixture distribution.

form_mix(f_list, weights = NULL)

## Arguments

f_list List of pdqr-functions. Can have different classes and types (see Details). Numeric vector of weights or NULL (default; corresponds to equal weights). Should be non-negative numbers with positive sum.

## Value

A pdqr-function for mixture distribution of certain type and class (see Details).

## Details

Type of output mixture is determined by the following algorithm:

• If f_list consists only from pdqr-functions of "discrete" type, then output will have "discrete" type.

• If f_list has at least one pdqr-function of type "continuous", then output will have "continuous" type. In this case all "discrete" pdqr-functions in f_list are approximated with corresponding dirac-like "continuous" functions (with form_retype(*, method = "dirac")). Note that this approximation has consequences during computation of comparisons. For example, if original "discrete" function f is for distribution with one element x, then probability of f >= x being true is 1. After retyping to dirac-like function, this probability will be 0.5, because of symmetrical dirac-like approximation. Using a little nudge to x of 1e-7 magnitude in the correct direction (f >= x - 1e-7 in this case) will have expected output.

Class of output mixture is determined by the class of the first element of f_list. To change output class, use one of as_*() functions to change class of first element in f_list or class of output.

Note that if output "continuous" pdqr-function for mixture distribution (in theory) should have discontinuous density, it is approximated continuously: discontinuities are represented as intervals in "x_tbl" with extreme slopes (see Examples).

# All "continuous" p_norm <- as_p(pnorm) d_unif <- as_d(dunif) con_mix <- form_mix(list(p_norm, d_unif), weights = c(0.7, 0.3)) # Output is a p-function, as is first element of f_list con_mix
# Use as_*() functions to change class d_con_mix <- as_d(con_mix) # Theoretical output density should be discontinuous, but here it is # approximated with continuous function con_x_tbl <- meta_x_tbl(con_mix) con_x_tbl[(con_x_tbl$x >= -1e-4) & (con_x_tbl$x <= 1e-4), ]
all_x_tbl <- meta_x_tbl(all_mix) # What dirac-like approximation looks like all_x_tbl[(all_x_tbl$x >= 1.5) & (all_x_tbl$x <= 2.5), ]