Corrections so that the package does what its documentation says, found by running it on public survival data. Detection stays deterministic and name-blind.
verify_roles(data, claim) checks a declared assignment of roles against the
name-blind value signature. Verdicts: contradicted (a falsification backed by a
value statistic), consistent (a reading the data support, never "correct") and
unverifiable with sub-reason identifiability (design roles: group, outcome,
covariate) or coverage (no test exists, or the evidence is empty). Binary scale
items are never consistent. contradicted is issued only for falsifications backed
by a value statistic (exact list in ?verify_roles); absence of a time-event
association is unverifiable(coverage), not a contradiction. Each claimed pair is
judged on its own, and a survival claim (time plus event) is one claim shown as two
rows. unclaimed lists blind-found structure the claim does not state under the
same role.
Detectors are unchanged. See ?verify_roles, the README and the vignette.harmonize_roles(sites) aligns the roles detected name-blind in two or more sites
(a named list of data.frames) into a map (role by site, aligned/partial/absent),
descriptive checks and a site_only table. Flags are categorical only:
type_mismatch, coding_mismatch, size_mismatch; Jaccard and range overlap are
reported but never flagged. The residual covariate role is excluded. Detectors
are unchanged. See ?harmonize_roles, the README and the vignette.coupled_pair role reports the
pair with both readings, and the user decides. Documented ceiling: a zero-anchored
continuous cause whose larger values are protective still reads as survival.coupled_pair.coupled_pair with the competing reading
named. A rival sharing the winner's time column agrees on the axis and merely
offers another event candidate (a ranking question), and an ID-typed time
candidate may win on its exceptional evidence bar but may not veto a
structurally-typed reading.outcome_binary is replaced by a
Bernoulli MDL code: a candidate cause is admitted only when its one-slope logistic
code -- or, for non-monotone dependence, a two-Gaussian split of the predictor by
the outcome -- saves more bits than the slope's parameter cost (1/2 log2 n) PLUS
the log2(m) model-index bits naming it among the m candidates (Rissanen two-part
code). The naming term makes the evidence selection-consistent, so scanning many
predictors on noise no longer buys phantom outcomes (~14% -> ~6% of pure-noise
tables); a weak borderline cause now stays honestly silent instead.group_var is the character/factor column with the highest normalized Shannon
entropy H/log2(k) (ties: fewer levels, then value fingerprint); a column with a level
seen fewer than 3 times is not a candidate. The point table is gone.paired_pairs,
otherwise agreement_pairs. potential_pairs now carries bits and shift_bits.scale_items are accepted when a one-factor Gaussian two-part code on the
standardized candidate columns saves bits over independence (.mdl_factor_bits).score/max_score/pct are bits (max_score NA) for derived roles and points for the
ported ones.repeated_measures as a one-factor block (false positives rose from 15 to
163-207 tables), and a derived binary-item scale criterion (it rejected every simulated
binary battery) each regressed false positives or recall and were reverted. Survival, wide repeated_measures and binary scale_items therefore
remain on point scorers.time_index. Date/POSIXct columns -- and character columns whose
every value parses as a date -- type as Datetime and are reported as calendar
axes. They were previously typed "Other" and invisible to every detector. The
class and format are properties of the values, so name-blindness is preserved.repeated_measures$panel_axes) and
subject_id stays silent. A Datetime column can be the panel time axis.scale_items, guarded by the
pairwise 2-sigma dependence gate; the >= 5-item path is unchanged.rolescry_default_name_bonus(domain = "finance")
(or "all"); the default "clinical" is unchanged. The name channel remains
optional and capped.Logical event columns. A TRUE/FALSE column now value-types as Binary; it was typed "Other" and silently excluded from every survival and outcome candidate set.
Sink veto in repeated measures. A column MDL-explained by two or more mutually
independent other block members is a dependency sink (collider), not a repeated
measurement, and is removed from the block. y = x1 + x2 + noise is no longer
swallowed as a correlated block, so the continuous outcome can be detected.
covariate is now the residual role. It lists the continuous, categorical and
binary columns that no other role claimed. In 0.2.0 it listed every such column,
including the survival pair, the group and the outcomes.
Survival pairs are compared on common rows. Every admissible time/event pair is
re-evaluated on the rows complete in all candidate columns. Previously each pair was
judged on its own available cases, so a pair whose columns were missing in different
rows could win on a different subsample (e.g. survival::lung).
Integer follow-up times. An all-distinct positive integer column (which value-types
as an identifier) is now a survival-time candidate. Because this overturns the
identifier typing, it must pass both association tests (monotone MDL and the dCor
independence test), not either one (e.g. survival::ovarian).
Subject id atomicity. A column already assigned to a survival role is no longer
also reported as subject_id.
NaN on tied values (a neighbor count
of -1 passed to digamma()), which made the dependence measure NaN and emitted
warnings (e.g. survival::pbc). Counts are now clamped at zero.NA).?detect_roles states that roles can overlap, that covariate is residual, and that
a role is reported as not found rather than guessed.Information-theoretic re-founding of the detection engine, a correctness fix to
the name-blindness contract, and more robust survival-code handling. Detection
remains deterministic and, by default (name_bonus = NULL), a pure function of
each column's value signature.
name_bonus = NULL. Previously a weak-signature identifier column could
be typed from its name; such a column is now typed from its values only, so
its assignment can differ from 0.1.0. This restores the package's core
invariant: renaming columns to col_1, col_2, ... cannot change any role.{0, 1}; factor and character codings are
intentionally not coerced.event_variable
fell just outside its pre-registered calibration band, and covariate remains
inadmissible (high false-positive rate) and is excluded from the headline.v.0.2.0; Zenodo 10.5281/zenodo.21003941)
in corrected vignette example data, test expectations aligned with the current
detector, a stats:: import, and an updated .Rbuildignore. Detection
behavior, its thresholds, and the confirmatory results above are unchanged.citation("rolescry") and CITATION.cff reference both rolescry and the
parent MDStatR engine.