---
title: "Contributions"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Contributions}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
## Product contributions
It's often convenient to decompose an index into the (additive)
contribution of each price relative, also known as the percent-change
contribution. This can be done with the same work flow used in
`vignette("piar")`, specifying `contrib = TRUE` when calling
`elemental_index()`.
```{r}
library(piar)
# Make an aggregation structure.
ms_weights[c("level1", "level2")] <-
expand_classification(ms_weights$classification)
pias <- ms_weights[c("level1", "level2", "business", "weight")] |>
as_aggregation_structure()
# Make elemental index with contributions.
elementals <- ms_prices |>
transform(
relative = price_relative(price, period = period, product = product)
) |>
elemental_index(
relative ~ period + business,
product = product,
na.rm = TRUE,
contrib = TRUE
)
```
As with index values, percent-change contributions for a given level of
the index can be extracted as a matrix.
```{r}
contrib(elementals, level = "B1")
```
Or as a data frame.
```{r}
contrib2DF(elementals, level = "B1")
```
Aggregating the elemental indexes automatically aggregates
percent-change contributions, so no extra steps are needed after the
elemental indexes are made.
```{r}
index <- aggregate(elementals, pias, na.rm = TRUE)
contrib(index)
```
## Index contributions
After an index has been calculated, it's often useful to compute the
contribution of higher-level indexes towards the total index. The
easiest way to do this with a collection of pre-computed index values is
to simply coerce them into an index object with the index values as
contributions and reaggregate with a restricted aggregation structure.
```{r}
index <- as_index(as.matrix(index), contrib = TRUE)
```
If the index values are already an index object, it's also possible to
directly replace the contributions.
```{r}
reset_contrib <- function(index) {
for (l in levels(index)) {
contrib(index, l) <- as.matrix(index[l]) - 1
}
index
}
index <- reset_contrib(index)
```
We now cut the aggregation structure to keep only the top two levels and
reaggregate to get the contribution of the second-level indexes to the
top level index.
```{r}
aggregate(index, cut(pias, 2)) |>
contrib()
```
The same approach works with a fixed-base index as well.
```{r}
chain(index) |>
reset_contrib() |>
aggregate(cut(pias, 2)) |>
contrib()
```