nsca_table: Joint necessity and sufficiency results

View source: R/results.R

nsca_tableR Documentation

Joint necessity and sufficiency results

Description

One row per condition and frontier technique. Both sides of a row always use the same technique, the same observations and the same scope.

Usage

nsca_table(model, legacy = FALSE)

Arguments

model

An object returned by nsca_analysis().

legacy

Append the column names retired in 0.3.0 and 0.4.0 as duplicates. See nsca_legacy_names().

Value

A data frame of joint results.

What is primary

The component effect sizes d_nec and d_suf are primary. Everything else is a way of putting them together, and three such ways are reported rather than one, because nothing in the geometry of two empty zones selects one.

weakest_effect

min(d_nec, d_suf), the fully non-compensatory summary. It falls to zero as soon as either component does and stays on the components' own scale, so its maximum is about 0.5 rather than 1.

balanced_joint_effect

2 * sqrt(d_nec * d_suf), normalised onto ⁠[0, 1]⁠. Partially compensatory: a larger component raises it at a diminishing rate, and it still collapses to zero if either component does. At an equal component sum of 0.80, ⁠(0.40, 0.40)⁠ gives 0.80 and ⁠(0.70, 0.10)⁠ gives 0.529. It is not a measure of balance: ⁠(0.50, 0.125)⁠ and ⁠(0.25, 0.25)⁠ both score 0.50. The balance column measures that separately.

joint_empty_zone_coverage

The share of the scope that at least one claim rules out, 1 - admissible_region_share. Curvature-neutral: it reaches 1 whenever the admissible region closes, whatever the shape of the relation.

min and the geometric mean are the power means at p = -Inf and p = 0, so choosing between them is choosing how much compensation to allow; the component sum sits at p = 1, the fully compensatory end, and is a poor conjunction summary because one strong component can carry it. nsca_joint() exposes the family directly.

The area identity

The two empty spaces and the admissible region tile the scope, so by inclusion and exclusion

\mathrm{admissible\_region\_share} = 1 - d_{nec} - d_{suf} + O

where O is overlap_share. Everything else follows from it rather than being asserted separately. Because admissible_region_share is a share of the scope it lies in ⁠[0, 1]⁠ unconditionally, and therefore so does joint_empty_zone_coverage. The other two indices are bounded only up to the overlap:

d_{nec} + d_{suf} \le 1 + O, \quad \mathrm{weakest\_effect} \le 0.5 + O/2, \quad \mathrm{balanced\_joint\_effect} \le 1 + O

Both bounds are tight and are attained exactly by a perfect diagonal, where O is 1 / (n - 1): at n = 40 the observed values are 0.5128 and 1.0256 against bounds of 0.5128 and 1.0256. The excess is discretization, not evidence, and the indices are left unclamped so that it stays visible.

Vocabulary

The column names follow the condition analysis in degree framework. relationship states the direction as a claim about the theorised X-Y relationship, as in Table 1 of that framework, not about the shape of the estimated frontier. necessity_empty_space and sufficiency_empty_space name what each expected empty space would contain, and necessity_boundary and sufficiency_boundary say whether the boundary separating it is a ceiling, which limits how high the outcome can be for a given condition value, or a floor, which limits how low. The two are always one of each, because the two corners are diagonally opposite.

The disjointness check

Whenever the two frontiers do not cross, the floor lies at or below the ceiling throughout the scope, so no point belongs to both expected empty spaces. Because each component effect size is that space's share of the same scope, the two shares cannot sum to more than one. Component effect sizes summing above one therefore say the frontiers have crossed and the joint result needs diagnosis before interpretation, rather than that it is unusually strong. component_sum reports d_nec + d_suf so that this rule can be applied directly.

frontiers_crossed answers the same question from the measurement rather than from the sum. The sum is a proxy for a crossing that is not otherwise available; here it is available, because overlap_share is the area on which the two empty spaces actually overlap, integrated from the reconstructed frontiers. Using the measurement avoids the proxy's failure mode, which is that the sum and the allowance below are reached by different routes and can disagree in the last few digits on exactly the configuration the check is meant to bless.

That allowance exists because a step frontier overlaps itself by construction. Between two consecutive observations the upper staircase still holds the earlier value while the lower one has already moved, so the two spaces overlap on every tread; summed over the n - 1 treads that is exactly 1 / (n - 1) of the scope, attained by a perfect diagonal, which is the cleanest relation there is rather than a failure. For every smooth frontier the allowance is zero and any overlap at all is a genuine crossing.

frontiers_crossed asks whether the frontiers crossed at all; geometry_acceptable asks whether they crossed by more than geometry.max_overlap. A row can be flagged as crossed and still have acceptable geometry.

Geometry diagnostics

reconstruction_error is the residual of the identity above. The two sides come from different places: admissible_region_share and overlap_share are integrated from the frontiers this package reconstructs, while d_nec and d_suf are reported by the engines from their own internal frontiers. A residual near zero says the two agree; a large one says the reconstruction has drifted from what the engine actually fitted, which is the one failure mode that a plot cannot reveal, because a wrongly reconstructed frontier still looks like a frontier.

degenerate marks a condition whose axis does not vary inside the declared scope. geometry_acceptable combines both diagnostics with the excess frontier overlap, allowing a step frontier the 1 / (n - 1) it produces by construction.

Decisions

p_nsca_iut is max(p_nec, p_suf), the intersection-union combination. It passes only when both components reject at test.p_threshold, and it is level-alpha without any assumption that the two component tests are independent, so no correction is needed merely for combining two pre-specified tests. Multiplicity across several conditions or frontiers is a separate matter. The combination is also typically conservative, so an NSCA design needs more observations than either component alone.

p_weakest_perm tests min(d_nec, d_suf) directly and is available only when shared.test.rep was used, because the null distribution of a statistic of both components depends on how they co-vary under random pairing. It answers a different question from the intersection-union rule and does not replace it: its null is random pairing alone, which is a proper subset of the union null "not necessary or not sufficient", so it carries no level-alpha guarantee over that union. Treat it as a sensitivity analysis. p_source reports whether the component p-values came from the engines' own separate runs or from the shared sequence.

necessity_supported and sufficiency_supported require significance and, when a relevance threshold was pre-specified, an effect at least that large. joint_support additionally requires geometry_acceptable, so a degenerate or badly reconstructed row cannot be reported as supported.

Blind spot

All three joint summaries are areas over the declared scope and share one blind spot. A constant outcome at the centre of an imposed scope leaves the upper and lower halves both empty, so both components reach 0.5, the data zone closes, and every index reports perfect joint support for data carrying no information. balanced_joint_effect is the most exposed, since weakest_effect at least follows the weaker side once the constant sits off centre. The degenerate flag and the permutation screen are what cover it: permuting a constant outcome reproduces the same geometry every time, so every p-value goes to 1.

No magnitude benchmarks are supplied for any index. Conventions for a single NCA effect size do not transfer: the scales differ, and under independence both components carry a positive finite-sample bias that balanced_joint_effect amplifies rather than cancels, by an amount depending on the sample size, the frontier technique and the scope. Calibrate by simulation on the design at hand.

See Also

nsca_results(), nsca_joint(), nsca_extract(), nsca_legacy_names()

Examples

set.seed(1)
x <- sort(runif(60))
dat <- data.frame(X = x, Y = pmin(pmax(x + rnorm(60, 0, 0.1), 0), 1))
fit <- nsca_analysis(dat, "X", "Y", ceilings = "ce_fdh")
nsca_table(fit)

NSCA documentation built on Oct. 10, 2026, 5:08 p.m.