Guide for Rater Agreement under Structural Skew.
Fixed labels for rater-reliability coefficients, the Landis-Koch bands and their descendants, drift with prevalence, rater count, and sample size: the same rater panel can land in a different category because the finding got rarer. grassr replaces the fixed scale with a calibrated reference. The rating matrix goes in, and a Report Card comes out that positions each coefficient among the values the study's own design can produce, bounds the panel qualities consistent with the observation, and flags panels whose coefficients disagree about the quality they imply.
install.packages("grassr") # CRAN release (0.7.4)
remotes::install_github("defense031/grassr") # development head (0.8.0)
library(grassr)
set.seed(29)
# Five raters, 200 subjects, Se = Sp = 0.85, prevalence 0.30.
truth <- rbinom(200, 1, 0.30)
Y <- sapply(1:5, function(j) {
ifelse(truth == 1, rbinom(200, 1, 0.85), rbinom(200, 1, 0.15))
})
grass_report(ratings = Y)
GRASS Report Card
sample = 5 raters, N = 200, pi_hat = 0.35
PABAK = 0.41 -> 62nd percentile | quality 0.78-0.85 <- primary
AC1 = 0.46 -> 62nd percentile | quality 0.77-0.85
Fleiss kappa = 0.36 -> 62nd percentile | quality 0.77-0.85
ICC = 0.46 -> 61st percentile | quality 0.76-0.85 [distribution-sensitive]
read: this panel agreed more tightly than 62% of what panels at this
design can produce; the data are consistent with panel quality 0.78-0.85.
delta = 0.01 pp implied-quality spread (aligned)
matched null = (k=5, N=200, q=0.82): delta_hat at the 27.1 percentile
See `summary(...)` for full panel and CI details.
See `plot(...)` for a surface-position visualization.
The percentile reads against a reference calibrated at the study's
rater count, sample size, and observed positive rate, not against a
fixed cutoff table. The consistency band (quality 0.78 to 0.85, which
contains the planted 0.85) is the set of panel qualities consistent
with the observed coefficient at this design; its width is the
precision this design can achieve. delta = 0.01 pp (aligned) means the three
agreement coefficients imply the same panel quality, so any one of
them can be cited as the panel's agreement level. When they diverge, the card suppresses the panel summary
and routes to per-rater output: a pairwise PABAK matrix,
pooled-reference sensitivity and specificity per rater, and a
latent-class fit.
grass_report(ratings = Y) returns the card. summary(),
as.data.frame(), and seven plot() views are available on the
result.position_on_surface(ratings = Y, metric = ...) positions one
coefficient and returns its percentile, consistency band, and
implied quality.check_asymmetry(ratings = Y) returns the implied-quality spread
delta_hat and its aligned / caution / divergent flag, read from
the spread's percentile on a null distribution matched to the
design (caution at the 95th percentile, divergent at the 99th).pairwise_agreement(ratings = Y) gives the per-rater breakdown
when the coefficients diverge.latent_class_fit(ratings = Y) returns per-rater Dawid-Skene
estimates at k >= 3 and Hui-Walter bounds at k = 2, with bootstrap
intervals.plot_surface(metric, ...) draws a coefficient's reference surface
before any data exist, for prospective design.The full walkthrough is vignette("grassr").
The bundled reference holds 44,616 surface cells at 2,000 draws each
and an 11,616-cell null lattice for delta_hat at 50,000 draws each,
spanning rater counts 2 through 25 and sample sizes 15 through 1,000.
Designs between calibrated cells are read by interpolation; rater
count snaps to the nearest calibrated value, and the card discloses
the cell it read. ICC is reported beside the agreement family with a
[distribution-sensitive] marker: its reference depends on the full
subject-prevalence distribution, represented by 52 calibrated
profiles, and it stays out of delta_hat.
v0.8.0 (development head): the delta_hat null now varies with
prevalence, and lookups interpolate between calibrated cells. v0.7.4 is the release on CRAN. Binary
inter-rater and intra-rater families are implemented; ?grass_roadmap
lists planned families (ordinal, multi-rater nominal, continuous), and
NEWS.md has the release history.
The package implements the method of Semmel & Gidaro (2026), A context-conditioned reporting convention for rater reliability on binary outcomes (working paper).
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.