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()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()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_paircoupled_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.