---
title: "Axes Reliability"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Axes Reliability}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---




``` r
library(circumplex)
```

**Level:** Advanced. Read "Latent Group Contrasts" first.



## 1. Overview

This vignette estimates how reliably a circumplex instrument measures its two
axes. Section 2, "What is axis reliability?", defines the quantity and the
variance components behind it. Section 3, "A worked example", runs
`axes_reliability()` on the `simulated_items` data. Section 4, "Reading the
components", reads the components and the global fit from `summary()`.
Section 5, "Starting from a published correlation matrix", fits the model
from a correlation matrix and a sample size. The Wrap-up lists what the page
covered and names the next page, "Axes Reliability Caveats". That page states
the properties of the method that shape how its output should be read. The
References list the source cited.

## 2. What is axis reliability?

A circumplex instrument places its scales around a circle. It summarizes a
person (or a profile of correlations) by a position on two orthogonal **axes**.
Here the axes are communion (the X axis, at 0°) and agency (the Y axis, at 90°).
Everything downstream uses those axis scores: a person's projected location, and
the displacement and amplitude of a Structural Summary Method profile.
`vignette("introduction-to-ssm-analysis")` defines displacement and amplitude.
So it is worth asking how *reliably* the instrument measures each axis.

`axes_reliability()` answers that question with the estimator of Strack, Jacobs,
and Grosse Holtforth (2013). It fits an item-level measurement model. The model
splits each item's variance into orthogonal pieces: a general factor shared by
all items, the two circumplex **axes**, scale specificity, and item error. For
an instrument administered in blocks, it adds a block-specificity component
("Axes Reliability Caveats" explains blocks). The function reads axis reliability off the
**axes** component alone. Reliability is then the Spearman–Brown "list-length"
reliability of a composite with the axis's effective test length, built from
items that share only their axes variance.

This is a different question from the other reliability-adjacent tools in the
package. `ssm_sem()` disattenuates (corrects for measurement error) a
*scale-level* SSM profile. `fit_structure()` evaluates whether a correlation matrix has circumplex
*structure* at all. `axes_reliability()` instead reports a single, interpretable
number per axis: how well the instrument measures communion and agency.

## 3. A worked example

The package ships `simulated_items`, a synthetic dataset of 1–7 Likert
responses from 500 respondents on 32 items. There are four items on each of the
eight octant scales, in the order that `octants()` returns. The items were drawn
from a five-component population that implies an axis reliability of about .78.
The five are a general factor, the two equal axes (axes variance .18), a shared
scale-specificity component of .10, block specificity, and free item error.
Block specificity is zero here, because the instrument is not blockwise.

`axes_reliability()` needs three things: the data, a map from items to scales,
and the scales' angles. The map is a list with one character vector of item
names per scale, in the same angle order as the angles you pass:


``` r
data("simulated_items")

# Four items per octant scale, in octants() order (PA, BC, DE, ..., NO).
items <- split(names(simulated_items), rep(1:8, each = 4))

res <- axes_reliability(simulated_items, items = items, angles = octants())
#> axes_reliability(): 500 complete case(s) used.
res
#> 
#> Circumplex Axes Reliability (Strack, Jacobs & Grosse Holtforth, 2013)
#> Input:        item data
#> Items:        32 (8 scales)
#> Complete N:   500
#> SEm scale:    std
#> 
#> # Per-axis reliability
#> 
#>  Axis item_n Reliability SEm   NB_Reliability
#>  X    16     0.773       0.476 0.822         
#>  Y    16     0.773       0.476 0.823         
#> 
#>   Note: the two axes share one axes-variance estimate and, with equal items
#>   per axis, carry the same reliability. This is expected, not an error.
#> 
#>   Note: the model is fit to the item correlation matrix as if it were a
#>   covariance matrix (Cudeck, 1989), and both sides of that mismatch are
#>   corrected, so these numbers differ from LISREL's, and from lavaan's own, by
#>   design.
#>   The component standard errors are adjusted to the correlation metric and
#>   are calibrated; they are typically smaller than the values printed by
#>   Strack et al. (2013), whose LISREL output carries no correction.
```

If your items belong to one of the package's built-in instruments, you can pass
the `instrument` object instead of `items` and `angles`. It supplies both the
scale angles and the item membership, exactly as `score()` does. (The example
above uses the explicit map because `simulated_items` is not a registered
instrument.)

The header confirms how many complete cases were used. For each axis, the
per-axis table reports the effective test length (`item_n`), the Strack axis
`Reliability` and its standard error of measurement (`SEm`). It also reports the
Nunnally–Bernstein reliability (`NB_Reliability`), a simpler formula that
Section 4 compares. For a balanced instrument (the same number of items on every
scale), the two axes share one axes-variance estimate and carry equal
`item_n`. So they report the same reliability, which is expected, not an error.

The recovered reliability (about .77) lands close to the .78 built into the
simulated population. The axes-variance estimate (below) recovers the population
value of .18.

## 4. Reading the components

`summary()` adds the estimated variance components and the model's global fit:


``` r
summary(res)
#> 
#> Circumplex Axes Reliability (Strack, Jacobs & Grosse Holtforth, 2013)
#> Input:        item data
#> Items:        32 (8 scales)
#> Complete N:   500
#> SEm scale:    std
#> 
#> # Per-axis reliability
#> 
#>  Axis item_n Reliability SEm   NB_Reliability
#>  X    16     0.773       0.476 0.822         
#>  Y    16     0.773       0.476 0.823         
#> 
#>   Note: the two axes share one axes-variance estimate and, with equal items
#>   per axis, carry the same reliability. This is expected, not an error.
#> 
#>   Note: the model is fit to the item correlation matrix as if it were a
#>   covariance matrix (Cudeck, 1989), and both sides of that mismatch are
#>   corrected, so these numbers differ from LISREL's, and from lavaan's own, by
#>   design.
#>   The component standard errors are adjusted to the correlation metric and
#>   are calibrated; they are typically smaller than the values printed by
#>   Strack et al. (2013), whose LISREL output carries no correction.
#> 
#> # Variance components
#> 
#>  Component         Estimate SE   
#>  general           0.051    0.005
#>  axes              0.175    0.009
#>  scale_specificity 0.093    0.008
#>  item              0.680    --   
#> 
#> # Global fit
#> 
#>   chi-square(493) = 488.27,  RMSEA = 0.000,  CFI = 1.000
#> 
#>   The global fit statistics chisq, pvalue, rmsea and cfi are scaled to that
#>   metric (Satorra & Bentler, 1994), which removes a distortion that flatters
#>   fit; df and srmr are unchanged. The scaled test can modestly over-reject at
#>   typical sample sizes: it over-flags misfit rather than flattering it; see
#>   ?axes_reliability for the measured rates.
#>   They follow lavaan's *.scaled definitions, not its *.robust ones, and
#>   differ from what fitMeasures() reports for an equivalent ML fit.
```

The **variance components** show the decomposition that the reliability rests
on. The `axes` component is the only one that feeds reliability. The `general`,
`scale_specificity` and `block_specificity` (when blocks were supplied)
components and item error are isolated from it. This is why the
Nunnally–Bernstein figure printed alongside runs **higher** than the Strack
reliability. N–B counts scale-specificity variance as axis variance rather than
isolating it. So it **overestimates** axis reliability whenever scale
specificity is non-trivial (Strack et al., 2013, Figure 3). The gap between the
two numbers shows how much scale-specific variance the simpler formula would
have credited to the axes in error.

## 5. Starting from a published correlation matrix

You do not always have the raw data. A paper may print an item correlation
matrix and nothing else, and that matrix is enough. Pass it as `cormat`, with
the sample size it was computed from, in place of `data`.


``` r
R <- cor(simulated_items)
axes_reliability(
  cormat = R, items = items, angles = octants(), n = nrow(simulated_items)
)
#> 
#> Circumplex Axes Reliability (Strack, Jacobs & Grosse Holtforth, 2013)
#> Input:        correlation matrix
#> Items:        32 (8 scales)
#> Sample N:     500
#> SEm scale:    std
#> 
#> # Per-axis reliability
#> 
#>  Axis item_n Reliability SEm   NB_Reliability
#>  X    16     0.773       0.476 --            
#>  Y    16     0.773       0.476 --            
#> 
#>   Note: the two axes share one axes-variance estimate and, with equal items
#>   per axis, carry the same reliability. This is expected, not an error.
#> 
#>   Note: the Nunnally-Bernstein comparison needs the raw item scores (scale
#>   alphas and the axis-composite variance), so it is NA on the
#>   correlation-matrix path.
#> 
#>   Note: the model is fit to the item correlation matrix as if it were a
#>   covariance matrix (Cudeck, 1989), and both sides of that mismatch are
#>   corrected, so these numbers differ from LISREL's, and from lavaan's own, by
#>   design.
#>   The component standard errors are adjusted to the correlation metric and
#>   are calibrated; they are typically smaller than the values printed by
#>   Strack et al. (2013), whose LISREL output carries no correction.
```

The estimates are identical to the raw-data run above. The raw-data path builds
exactly this matrix internally and fits it the same way. `items` selects and
orders the matrix's rows by name, so the matrix's own column ordering does not
matter. The matrix must be symmetric, positive definite, and have a unit
diagonal (the model assumes unit-variance items).

Two things are unavailable here, and both for the same reason: they are
properties of the respondents, not of their correlations. The
Nunnally–Bernstein comparison is `NA`, which the table prints as `--`. It needs each scale's alpha
and the axis composite's variance, and a correlation matrix carries neither.
And `sd = "raw"` is refused, because there are no scale scores to take an
observed SD from. If you want SEm on a raw scale, pass numeric axis SDs to
`sd`. Both are reported rather than silently omitted, so a matrix-based
result cannot be mistaken for a raw-data one.

## Wrap-up

`axes_reliability()` gives a compact, per-axis answer to "how reliably does this
instrument measure communion and agency?" It isolates the axes variance from the
general and scale-specific components, which a simpler reliability formula would
conflate. Use it to characterize a circumplex instrument before leaning on its
axis scores. Read its output with the correlation-as-covariance, missing-data,
and boundary caveats in mind. The next page to read is "Axes Reliability
Caveats", which states those caveats and the limits of the model.

## References

* Strack, S., Jacobs, K. A., & Grosse Holtforth, M. (2013). The reliability of
  circumplex axes. _SAGE Open, 3_(2). https://doi.org/10.1177/2158244013486115
