Unbounded density estimator using stats::density(). Supports automatic partial function application.

density_unbounded(
  x,
  weights = NULL,
  n = 512,
  bandwidth = "nrd0",
  adjust = 1,
  kernel = "gaussian",
  trim = FALSE
)

Arguments

x

numeric vector containing a sample to compute a density estimate for.

weights

optional numeric vector of weights to apply to x.

n

numeric: the number of grid points to evaluate the density estimator at.

bandwidth

bandwidth of the density estimator. One of:

  • a numeric: the bandwidth, as the standard deviation of the kernel

  • a function: a function taking x (the sample) and returning the bandwidth

  • a string: the suffix of the name of a function starting with "bw." that will be used to determine the bandwidth. See bw.nrd0() for a list.

adjust

numeric: the bandwidth for the density estimator is multiplied by this value. See stats::density().

kernel

string: the smoothing kernel to be used. This must partially match one of "gaussian", "rectangular", "triangular", "epanechnikov", "biweight", "cosine", or "optcosine". See stats::density().

trim

Should the density estimate be trimmed to the bounds of the data?

Value

An object of class "density", mimicking the output format of stats:density(), with the following components:

  • x: The grid of points at which the density was estimated.

  • y: The estimated density values.

  • bw: The bandwidth.

  • n: The sample size of the x input argument.

  • call: The call used to produce the result, as a quoted expression.

  • data.name: The deparsed name of the x input argument.

  • has.na: Always FALSE (for compatibility).

This allows existing methods (like print() and plot()) to work if desired. This output format (and in particular, the x and y components) is also the format expected by the density argument of the stat_slabinterval()

and the smooth_ family of functions.

See also

Other density estimators: density_auto(), density_bounded()

Examples

library(distributional)
library(dplyr)
library(ggplot2)

# For compatibility with existing code, the return type of density_unbounded()
# is the same as stats::density(), ...
set.seed(123)
x = rbeta(5000, 1, 3)
d = density_unbounded(x)
d
#> 
#> Call:
#> 	density_unbounded(x = x)
#> 
#> Data: x (5000 obs.);	Bandwidth 'bw' = 0.03141
#> 
#>        x                  y            
#>  Min.   :-0.09421   Min.   :0.0000648  
#>  1st Qu.: 0.18969   1st Qu.:0.1113278  
#>  Median : 0.47358   Median :0.5863921  
#>  Mean   : 0.47358   Mean   :0.8797226  
#>  3rd Qu.: 0.75747   3rd Qu.:1.5699993  
#>  Max.   : 1.04137   Max.   :2.6131888  

# ... thus, while designed for use with the `density` argument of
# stat_slabinterval(), output from density_unbounded() can also be used with
# base::plot():
plot(d)


# here we'll use the same data as above, but pick either density_bounded()
# or density_unbounded() (which is equivalent to stats::density()). Notice
# how the bounded density (green) is biased near the boundary of the support,
# while the unbounded density is not.
data.frame(x) %>%
  ggplot() +
  stat_slab(
    aes(xdist = dist), data = data.frame(dist = dist_beta(1, 3)),
    alpha = 0.25
  ) +
  stat_slab(aes(x), density = "bounded", fill = NA, color = "#d95f02", alpha = 0.5) +
  stat_slab(aes(x), density = "unbounded", fill = NA, color = "#1b9e77", alpha = 0.5) +
  scale_thickness_shared() +
  theme_ggdist()