Skip to contents

A user-friendly wrapper around PCA, made to work with ggfacto functions like interpret, ggfacto and hierarchical_clust. Variables are selected the way of the `tidyverse`, as in tabxplor::tab(). `PCA2()` is its name in ggfacto 0.3.2, kept for former code.

Usage

principal_component_analysis(
  data,
  active_vars,
  wt,
  col.w = NULL,
  ind_name,
  scale.unit = TRUE,
  ind.sup = NULL,
  ncp = Inf,
  graph = FALSE,
  na = "mean",
  filter,
  ...
)

PCA2(
  data,
  active_vars,
  wt,
  col.w = NULL,
  ind_name,
  scale.unit = TRUE,
  ind.sup = NULL,
  ncp = Inf,
  graph = FALSE,
  na = "mean",
  filter,
  ...
)

Arguments

data

The data frame. To analyse a subset of the population, give the whole data frame and `filter`, or filter it inside the call with the native pipe, `data |> dplyr::filter(...) |> principal_component_analysis(...)`: the analysis then remembers which rows it used, so that ggpca, hierarchical_clust or is_in_analysis can be given the whole data frame afterwards.

active_vars

<tidy-select> The names of the active variables.

wt

<tidy-select> The weight variable, if any.

col.w

The weights of the columns, as a numeric vector of the same length than `active_vars.`

ind_name

<tidy-select> Possibly, the variable holding the names of the individuals.

scale.unit

A boolean, if `TRUE` (value set by default) then data are scaled to unit variance.

ind.sup

A vector indicating the indexes of the supplementary individuals, rows of `data`.

ncp

Number of dimensions kept in the results. All of them by default: the eigenvalue table is how one chooses how many axes to interpret, and a truncated one cannot show the drop. To cluster on the first axes, give hierarchical_clust its own `ncp`.

graph

A boolean, set to `TRUE` to display the base graph.

na

How missing values of the active variables are treated. `"mean"`, the default, places each one at its variable's weighted mean, where it adds nothing to the axes (as an excluded level does in a specific multiple correspondence analysis); the tooltips and interpret count them. `"drop"` leaves out the rows with a missing value.

filter

A condition on the rows of `data`, as in dplyr::filter(): only the rows where it is `TRUE` are analysed (`filter = AGE >= 18`). Supplementary individuals are kept.

...

Additional arguments to pass to PCA.

Value

A `PCA` object from FactoMineR, with one more element, `source`, which records for each row of `data` its row in the analysis (`NA` if it was not analysed).

Examples

cars <- dplyr::mutate(mtcars, cyl = factor(cyl))
res.pca <- principal_component_analysis(cars, c(mpg, disp, hp, drat, wt, qsec))
interpret(res.pca)                           # the eigenvalues, then the axes
#> <div class="tx-scrollbox"><table class="tabxplor-tab" data-quarto-disable-processing="true"><thead><tr><th class="tx-span" colspan="1"></th><th class="tx-span" colspan="3">Variables</th><th class="tx-span" colspan="3">Axe 1</th><th class="tx-span" colspan="3">Axe 2</th><th class="tx-span" colspan="3">Axe 3</th></tr><tr><th class="tx-l tx-br tx-bl tx-rv" rowspan="2">variable</th><th class="tx-r tx-num">mean</th><th class="tx-r tx-num">sd</th><th class="tx-r tx-num tx-br">sd/mean</th><th class="tx-r tx-num">coord</th><th class="tx-r tx-num">contrib</th><th class="tx-r tx-num tx-br">cos2</th><th class="tx-r tx-num">coord</th><th class="tx-r tx-num">contrib</th><th class="tx-r tx-num tx-br">cos2</th><th class="tx-r tx-num">coord</th><th class="tx-r tx-num">contrib</th><th class="tx-r tx-num tx-br">cos2</th></tr><tr><th class="tx-r tx-num tx-unit">&lt;mean&gt;</th><th class="tx-r tx-num tx-unit">&lt;sd&gt;</th><th class="tx-r tx-num tx-br tx-unit">&lt;cv&gt;</th><th class="tx-r tx-num tx-unit">&lt;mean&gt;</th><th class="tx-r tx-num tx-unit">&lt;col%&gt;</th><th class="tx-r tx-num tx-br tx-unit">&lt;row%&gt;</th><th class="tx-r tx-num tx-unit">&lt;mean&gt;</th><th class="tx-r tx-num tx-unit">&lt;col%&gt;</th><th class="tx-r tx-num tx-br tx-unit">&lt;row%&gt;</th><th class="tx-r tx-num tx-unit">&lt;mean&gt;</th><th class="tx-r tx-num tx-unit">&lt;col%&gt;</th><th class="tx-r tx-num tx-br tx-unit">&lt;row%&gt;</th></tr></thead><tbody><tr><td class="tx-l tx-br tx-bl tx-rv">mpg</td><td class="tx-r tx-num g2">20.09</td><td class="tx-r tx-num g2">5.93</td><td class="tx-r tx-num tx-br g2">30%</td><td class="tx-r tx-num m4 tx-b">-0.94</td><td class="tx-r tx-num g2">21%</td><td class="tx-r tx-num tx-br g2">88%</td><td class="tx-r tx-num g1">-0.06</td><td class="tx-r tx-num g2">0%</td><td class="tx-r tx-num tx-br g2">0%</td><td class="tx-r tx-num m1 tx-b">-0.11</td><td class="tx-r tx-num g2">4%</td><td class="tx-r tx-num tx-br g2">1%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">disp</td><td class="tx-r tx-num g2">230.72</td><td class="tx-r tx-num g2">121.99</td><td class="tx-r tx-num tx-br g2">53%</td><td class="tx-r tx-num p4 tx-b">0.95</td><td class="tx-r tx-num g2">22%</td><td class="tx-r tx-num tx-br g2">91%</td><td class="tx-r tx-num g1">0.06</td><td class="tx-r tx-num g2">0%</td><td class="tx-r tx-num tx-br g2">0%</td><td class="tx-r tx-num g1">0.06</td><td class="tx-r tx-num g2">1%</td><td class="tx-r tx-num tx-br g2">0%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">hp</td><td class="tx-r tx-num g2">146.69</td><td class="tx-r tx-num g2">67.48</td><td class="tx-r tx-num tx-br g2">46%</td><td class="tx-r tx-num p4 tx-b">0.87</td><td class="tx-r tx-num g2">18%</td><td class="tx-r tx-num tx-br g2">76%</td><td class="tx-r tx-num m2 tx-b">-0.39</td><td class="tx-r tx-num g2">13%</td><td class="tx-r tx-num tx-br g2">15%</td><td class="tx-r tx-num g1">0.08</td><td class="tx-r tx-num g2">2%</td><td class="tx-r tx-num tx-br g2">1%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">drat</td><td class="tx-r tx-num g2">3.60</td><td class="tx-r tx-num g2">0.53</td><td class="tx-r tx-num tx-br g2">15%</td><td class="tx-r tx-num m3 tx-b">-0.75</td><td class="tx-r tx-num g2">13%</td><td class="tx-r tx-num tx-br g2">56%</td><td class="tx-r tx-num m3 tx-b">-0.47</td><td class="tx-r tx-num g2">19%</td><td class="tx-r tx-num tx-br g2">22%</td><td class="tx-r tx-num p3 tx-b">0.46</td><td class="tx-r tx-num g2">64%</td><td class="tx-r tx-num tx-br g2">21%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">wt</td><td class="tx-r tx-num g2">3.22</td><td class="tx-r tx-num g2">0.96</td><td class="tx-r tx-num tx-br g2">30%</td><td class="tx-r tx-num p4 tx-b">0.90</td><td class="tx-r tx-num g2">19%</td><td class="tx-r tx-num tx-br g2">81%</td><td class="tx-r tx-num p2 tx-b">0.32</td><td class="tx-r tx-num g2">9%</td><td class="tx-r tx-num tx-br g2">10%</td><td class="tx-r tx-num p2 tx-b">0.24</td><td class="tx-r tx-num g2">17%</td><td class="tx-r tx-num tx-br g2">6%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">qsec</td><td class="tx-r tx-num g2">17.85</td><td class="tx-r tx-num g2">1.76</td><td class="tx-r tx-num tx-br g2">10%</td><td class="tx-r tx-num m3 tx-b">-0.52</td><td class="tx-r tx-num g2">6%</td><td class="tx-r tx-num tx-br g2">27%</td><td class="tx-r tx-num p4 tx-b">0.82</td><td class="tx-r tx-num g2">58%</td><td class="tx-r tx-num tx-br g2">67%</td><td class="tx-r tx-num p1 tx-b">0.20</td><td class="tx-r tx-num g2">12%</td><td class="tx-r tx-num tx-br g2">4%</td></tr>
#> <tr class="tx-b tx-bt tx-bb tx-bb2"><td class="tx-l tx-br tx-bl tx-rv">Total</td><td class="tx-r tx-num g2"></td><td class="tx-r tx-num g2"></td><td class="tx-r tx-num tx-br g2"></td><td class="tx-r tx-num tx-b"></td><td class="tx-r tx-num tx-b">100%</td><td class="tx-r tx-num tx-br tx-b"></td><td class="tx-r tx-num tx-b"></td><td class="tx-r tx-num tx-b">100%</td><td class="tx-r tx-num tx-br tx-b"></td><td class="tx-r tx-num tx-b"></td><td class="tx-r tx-num tx-b">100%</td><td class="tx-r tx-num tx-br tx-b"></td></tr></tbody><tfoot><tr><td colspan="13"><div class="tx-foot">Coordinate on the axis, i.e. its correlation with it: a variable above, by <span class="p1" style="font-weight:bold;">+0.1</span>; <span class="p2" style="font-weight:bold;">+0.2</span>; <span class="p3" style="font-weight:bold;">+0.4</span>; <span class="p4" style="font-weight:bold;">+0.8</span> SD; a variable below, by <span class="m1" style="font-weight:bold;">-0.1</span>; <span class="m2" style="font-weight:bold;">-0.2</span>; <span class="m3" style="font-weight:bold;">-0.4</span>; <span class="m4" style="font-weight:bold;">-0.8</span> SD.<br><b>contrib</b>: its contribution to the variance of the axis; an axis sums to 100 %<br>cos2: quality of representation<br>sd/mean: coefficient of variation -- the standard deviation as a percentage of the mean, comparable between variables measured in different units</div></td></tr></tfoot></table></div>
#> <div class="tx-scrollbox"><table class="tabxplor-tab" data-quarto-disable-processing="true"><thead><tr><th class="tx-span" colspan="1"></th><th class="tx-span" colspan="3">Variance</th></tr><tr><th class="tx-l tx-br tx-bl tx-rv" rowspan="2">Axe</th><th class="tx-r tx-num">eigenvalue</th><th class="tx-r tx-num">% variance</th><th class="tx-r tx-num tx-br">cumul.</th></tr><tr><th class="tx-r tx-num tx-unit">&lt;var&gt;</th><th class="tx-r tx-num tx-unit">&lt;col%&gt;</th><th class="tx-r tx-num tx-br tx-unit"></th></tr></thead><tbody><tr><td class="tx-l tx-br tx-bl tx-rv">Axe 1</td><td class="tx-r tx-num g2">4.187</td><td class="tx-r tx-num g2 tx-bar tx-bar-on" style="--tx-bar:100%">69.8%</td><td class="tx-r tx-num tx-br g2">69.8%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">Axe 2</td><td class="tx-r tx-num g2">1.148</td><td class="tx-r tx-num g2 tx-bar tx-bar-on" style="--tx-bar:27.4%">19.1%</td><td class="tx-r tx-num tx-br g2">88.9%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">Axe 3</td><td class="tx-r tx-num g2">0.333</td><td class="tx-r tx-num g2 tx-bar tx-bar-on" style="--tx-bar:8%">5.6%</td><td class="tx-r tx-num tx-br g2">94.5%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">Axe 4</td><td class="tx-r tx-num g2">0.154</td><td class="tx-r tx-num g2 tx-bar tx-bar-on" style="--tx-bar:3.7%">2.6%</td><td class="tx-r tx-num tx-br g2">97.1%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">Axe 5</td><td class="tx-r tx-num g2">0.125</td><td class="tx-r tx-num g2 tx-bar tx-bar-on" style="--tx-bar:3%">2.1%</td><td class="tx-r tx-num tx-br g2">99.1%</td></tr>
#> <tr><td class="tx-l tx-br tx-bl tx-rv">Axe 6</td><td class="tx-r tx-num g2">0.052</td><td class="tx-r tx-num g2 tx-bar tx-bar-on" style="--tx-bar:1.2%">0.9%</td><td class="tx-r tx-num tx-br g2">100%</td></tr>
#> <tr class="tx-b tx-bt tx-bb tx-bb2"><td class="tx-l tx-br tx-bl tx-rv">Total</td><td class="tx-r tx-num g2">6.000</td><td class="tx-r tx-num tx-b">100%</td><td class="tx-r tx-num tx-br tx-b"></td></tr></tbody></table></div>
# \donttest{
ggfacto(res.pca, cars, sup_vars = cyl)       # the individuals and the variables (biplot)

ggfacto(res.pca, profiles = FALSE)           # the circle of correlations alone

ggfacto(res.pca, cars, sup_vars = cyl, interactive = TRUE)  # hover: the means
# }