Discrete Distribution Data Analysis with Wasserstein distance
DDAWASS is an R package for the analysis of data tables whose cells are discrete distributions with a finite support: for example the distributions of the scores given on a Likert scale by groups of respondents, of grades, of ratings or of counts. Each row is a statistical unit (a group, a territory, a company, ...), each column a distributional variable, and distributions are compared through the L2 Wasserstein distance between their quantile functions.
It is the discrete counterpart of HistDAWass (histogram data) and provides:
distributionD (a discrete distribution) and MatD (a matrix
of discrete distributions), built from raw microdata, frequency tables,
histograms or legacy nested tibbles;The development version can be installed from GitHub:
# install.packages("remotes")
remotes::install_github("Airpino/DDAWASS", build_vignettes = TRUE)
The package contains C++ code: on Windows, Rtools is needed to install it from source.
The univer data of the CUB
package contain the 1-7 evaluations of the orientation services of the
University of Naples Federico II given by 2179 students. We describe each
faculty-by-gender group by the distributions of its scores.
library(DDAWASS)
data(univer, package = "CUB")
univer$Faculty <- factor(sprintf("F%02d", univer$faculty))
univer$Gender <- factor(univer$gender, levels = 0:1, labels = c("M", "W"))
items <- c("informat", "willingn", "officeho", "compete", "global")
M <- data2MatD(univer, unit = c("Faculty", "Gender"), vars = items,
support = 1:7, min.n = 10)
M[1:4, 1:3]
#> a matrix of discrete distributions
#> 4 rows x 3 columns
#> informat willingn officeho
#> F01_M [m=5.35 s=1.73 k=7] [m=6.19 s=1.23 k=7] [m=5.77 s=1.41 k=7]
#> F01_W [m=5.16 s=1.72 k=7] [m=6.42 s=0.674 k=7] [m=5.42 s=1.57 k=7]
#> F02_M [m=6.62 s=0.785 k=7] [m=6.65 s=0.748 k=7] [m=6.3 s=1.19 k=7]
#> F02_W [m=6.47 s=1.07 k=7] [m=6.49 s=0.965 k=7] [m=6.23 s=1.34 k=7]
Distance between two groups, decomposed into the contributions of the means
(POSITION), of the standard deviations (SIZE) and of the shapes:
WassSqDistD(get.cell.MatD(M, "F02_M", "global"),
get.cell.MatD(M, "F06_M", "global"), details = TRUE)
#> SQ.W POSITION SIZE SHAPE rQQ
#> 5.4861184 4.0232281 0.9578624 0.5050279 0.7773405
Barycenter of the global satisfaction, expressed on the 1-7 scale, and Wasserstein correlations between the items:
WD.vec.mean.simplified(M[, "global"], support = 1:7)
#> Discrete distribution (7 support values)
#> x p cdf
#> 1 0.00000 0.00000
#> 2 0.00870 0.00870
#> 3 0.04008 0.04878
#> 4 0.10507 0.15385
#> 5 0.15385 0.30769
#> 6 0.45012 0.75781
#> 7 0.24219 1.00000
#> mean = 5.72317 std = 1.11335
round(WD.correlation(M), 2)
#> informat willingn officeho compete global
#> informat 1.00 0.64 0.56 0.78 0.75
#> willingn 0.64 1.00 0.51 0.66 0.72
#> officeho 0.56 0.51 1.00 0.53 0.58
#> compete 0.78 0.66 0.53 1.00 0.83
#> global 0.75 0.72 0.58 0.83 1.00
Clustering and regression:
set.seed(123)
km <- WD_kmeans(M, k = 3, rep = 20)
km$solution$cardinality
#> 1 2 3
#> 4 12 10
pars <- WD.regression.two.components(M, Yvar = "global",
Xvars = c("informat", "willingn", "officeho", "compete"))
round(pars, 3)
#> (AV_Intercept) AV_informat AV_willingn AV_officeho AV_compete
#> -0.217 0.049 0.232 0.156 0.610
#> CEN_informat CEN_willingn CEN_officeho CEN_compete
#> 0.162 0.240 0.056 0.419
MatD.browseVignettes("DDAWASS")
| Task | Functions |
|---|---|
| Build data |
distributionD(), MatD(), data2MatD(), long2MatD(), MatH2MatD(), tibble2MatD()
|
| Describe |
get.MatD.stats(), meanD(), stdD(), skewD(), compQ(), compP()
|
| Barycenter and dispersion |
WD.vec.mean(), WD.vec.mean.simplified(), simplifyD(), WD.var.covar(), WD.correlation(), WD.SSQ()
|
| Distances |
WassSqDistD(), WD_MAT_DIST(), rQQ()
|
| Clustering |
WD_hclust(), WD_kmeans()
|
| Factorial methods |
WD.1d.PCA(), WD.MultiplePCA(), WD.plot.Spanish.fan()
|
| Regression |
WD.regression.two.components(), WD.regression.two.components.predict(), WD.regression.GOF()
|
| Reliability | WD.cronbach() |
GPL (>= 3)