antecedent.validation

Discovery stability validators.

Thin wrappers over antecedent-validate stability checks (PCMCI block bootstrap, false-positive surrogates, parameter grids, orientation, null calibration, environment holdout, regime stability).

  1"""Discovery stability validators.
  2
  3Thin wrappers over ``antecedent-validate`` stability checks (PCMCI block bootstrap,
  4false-positive surrogates, parameter grids, orientation, null calibration,
  5environment holdout, regime stability).
  6"""
  7
  8from __future__ import annotations
  9
 10from typing import Any, Mapping, Sequence
 11
 12from ._data import as_columns, as_multi_env_columns
 13from ._native import (
 14    validate_environment_holdout as _validate_environment_holdout,
 15    validate_pcmci_alpha_sensitivity as _validate_pcmci_alpha_sensitivity,
 16    validate_pcmci_block_bootstrap as _validate_pcmci_block_bootstrap,
 17    validate_pcmci_ci_sensitivity as _validate_pcmci_ci_sensitivity,
 18    validate_pcmci_false_positive as _validate_pcmci_false_positive,
 19    validate_pcmci_lag_sensitivity as _validate_pcmci_lag_sensitivity,
 20    validate_pcmci_plus_orientation as _validate_pcmci_plus_orientation,
 21    validate_regime_stability as _validate_regime_stability,
 22    validate_synthetic_null_calibration as _validate_synthetic_null_calibration,
 23)
 24
 25
 26def validate_pcmci_block_bootstrap(
 27    data: Mapping[str, Any] | Any,
 28    *,
 29    max_lag: int = 1,
 30    alpha: float = 0.05,
 31    fdr: bool = False,
 32    ci: str = "parcorr",
 33    replicates: int = 20,
 34    block_size: int = 20,
 35    seed: int = 1,
 36    threads: int = 1,
 37) -> dict[str, Any]:
 38    names, columns = as_columns(data)
 39    return _validate_pcmci_block_bootstrap(
 40        names,
 41        columns,
 42        max_lag=max_lag,
 43        alpha=alpha,
 44        fdr=fdr,
 45        ci=ci,
 46        replicates=replicates,
 47        block_size=block_size,
 48        seed=seed,
 49        threads=threads,
 50    )
 51
 52
 53def validate_pcmci_false_positive(
 54    data: Mapping[str, Any] | Any,
 55    *,
 56    max_lag: int = 1,
 57    alpha: float = 0.05,
 58    fdr: bool = False,
 59    ci: str = "parcorr",
 60    transform: str = "permute",
 61    replicates: int = 20,
 62    seed: int = 1,
 63    threads: int = 1,
 64) -> dict[str, Any]:
 65    names, columns = as_columns(data)
 66    return _validate_pcmci_false_positive(
 67        names,
 68        columns,
 69        max_lag=max_lag,
 70        alpha=alpha,
 71        fdr=fdr,
 72        ci=ci,
 73        transform=transform,
 74        replicates=replicates,
 75        seed=seed,
 76        threads=threads,
 77    )
 78
 79
 80def validate_pcmci_alpha_sensitivity(
 81    data: Mapping[str, Any] | Any,
 82    alphas: Sequence[float],
 83    *,
 84    max_lag: int = 1,
 85    fdr: bool = False,
 86    ci: str = "parcorr",
 87    seed: int = 1,
 88    threads: int = 1,
 89) -> dict[str, Any]:
 90    names, columns = as_columns(data)
 91    return _validate_pcmci_alpha_sensitivity(
 92        names,
 93        columns,
 94        list(alphas),
 95        max_lag=max_lag,
 96        fdr=fdr,
 97        ci=ci,
 98        seed=seed,
 99        threads=threads,
100    )
101
102
103def validate_pcmci_lag_sensitivity(
104    data: Mapping[str, Any] | Any,
105    max_lags: Sequence[int],
106    *,
107    alpha: float = 0.05,
108    fdr: bool = False,
109    ci: str = "parcorr",
110    seed: int = 1,
111    threads: int = 1,
112) -> dict[str, Any]:
113    names, columns = as_columns(data)
114    return _validate_pcmci_lag_sensitivity(
115        names,
116        columns,
117        [int(m) for m in max_lags],
118        alpha=alpha,
119        fdr=fdr,
120        ci=ci,
121        seed=seed,
122        threads=threads,
123    )
124
125
126def validate_pcmci_ci_sensitivity(
127    data: Mapping[str, Any] | Any,
128    ci_names: Sequence[str],
129    *,
130    max_lag: int = 1,
131    alpha: float = 0.05,
132    fdr: bool = False,
133    seed: int = 1,
134    threads: int = 1,
135) -> dict[str, Any]:
136    names, columns = as_columns(data)
137    return _validate_pcmci_ci_sensitivity(
138        names,
139        columns,
140        list(ci_names),
141        max_lag=max_lag,
142        alpha=alpha,
143        fdr=fdr,
144        seed=seed,
145        threads=threads,
146    )
147
148
149def validate_pcmci_plus_orientation(
150    data: Mapping[str, Any] | Any,
151    *,
152    max_lag: int = 1,
153    alpha: float = 0.05,
154    fdr: bool = False,
155    ci: str = "parcorr",
156    replicates: int = 20,
157    block_size: int = 20,
158    seed: int = 1,
159    threads: int = 1,
160) -> dict[str, Any]:
161    names, columns = as_columns(data)
162    return _validate_pcmci_plus_orientation(
163        names,
164        columns,
165        max_lag=max_lag,
166        alpha=alpha,
167        fdr=fdr,
168        ci=ci,
169        replicates=replicates,
170        block_size=block_size,
171        seed=seed,
172        threads=threads,
173    )
174
175
176def validate_synthetic_null_calibration(
177    *,
178    max_lag: int = 1,
179    alpha: float = 0.05,
180    fdr: bool = False,
181    ci: str = "parcorr",
182    n_sim: int = 20,
183    n_obs: int = 100,
184    n_vars: int = 3,
185    seed: int = 1,
186    threads: int = 1,
187) -> dict[str, Any]:
188    return _validate_synthetic_null_calibration(
189        max_lag=max_lag,
190        alpha=alpha,
191        fdr=fdr,
192        ci=ci,
193        n_sim=n_sim,
194        n_obs=n_obs,
195        n_vars=n_vars,
196        seed=seed,
197        threads=threads,
198    )
199
200
201def validate_environment_holdout(
202    data: Sequence[Mapping[str, Any] | Any],
203    *,
204    max_lag: int = 1,
205    alpha: float = 0.05,
206    fdr: bool = False,
207    ci: str = "parcorr",
208    n_discovery: int = 1,
209    seed: int = 1,
210    threads: int = 1,
211) -> dict[str, Any]:
212    names, env_columns = as_multi_env_columns(data)
213    return _validate_environment_holdout(
214        names,
215        env_columns,
216        max_lag=max_lag,
217        alpha=alpha,
218        fdr=fdr,
219        ci=ci,
220        n_discovery=n_discovery,
221        seed=seed,
222        threads=threads,
223    )
224
225
226def validate_regime_stability(
227    data: Mapping[str, Any] | Any,
228    regimes: Sequence[int],
229    *,
230    max_lag: int = 1,
231    alpha: float = 0.05,
232    fdr: bool = False,
233    ci: str = "parcorr",
234    replicates: int = 10,
235    block_size: int = 20,
236    seed: int = 1,
237    threads: int = 1,
238) -> dict[str, Any]:
239    names, columns = as_columns(data)
240    return _validate_regime_stability(
241        names,
242        columns,
243        [int(r) for r in regimes],
244        max_lag=max_lag,
245        alpha=alpha,
246        fdr=fdr,
247        ci=ci,
248        replicates=replicates,
249        block_size=block_size,
250        seed=seed,
251        threads=threads,
252    )
253
254
255__all__ = [
256    "validate_environment_holdout",
257    "validate_pcmci_alpha_sensitivity",
258    "validate_pcmci_block_bootstrap",
259    "validate_pcmci_ci_sensitivity",
260    "validate_pcmci_false_positive",
261    "validate_pcmci_lag_sensitivity",
262    "validate_pcmci_plus_orientation",
263    "validate_regime_stability",
264    "validate_synthetic_null_calibration",
265]
def validate_environment_holdout( data: Sequence[Union[Mapping[str, Any], Any]], *, max_lag: int = 1, alpha: float = 0.05, fdr: bool = False, ci: str = 'parcorr', n_discovery: int = 1, seed: int = 1, threads: int = 1) -> dict[str, typing.Any]:
202def validate_environment_holdout(
203    data: Sequence[Mapping[str, Any] | Any],
204    *,
205    max_lag: int = 1,
206    alpha: float = 0.05,
207    fdr: bool = False,
208    ci: str = "parcorr",
209    n_discovery: int = 1,
210    seed: int = 1,
211    threads: int = 1,
212) -> dict[str, Any]:
213    names, env_columns = as_multi_env_columns(data)
214    return _validate_environment_holdout(
215        names,
216        env_columns,
217        max_lag=max_lag,
218        alpha=alpha,
219        fdr=fdr,
220        ci=ci,
221        n_discovery=n_discovery,
222        seed=seed,
223        threads=threads,
224    )
def validate_pcmci_alpha_sensitivity( data: Union[Mapping[str, Any], Any], alphas: Sequence[float], *, max_lag: int = 1, fdr: bool = False, ci: str = 'parcorr', seed: int = 1, threads: int = 1) -> dict[str, typing.Any]:
 81def validate_pcmci_alpha_sensitivity(
 82    data: Mapping[str, Any] | Any,
 83    alphas: Sequence[float],
 84    *,
 85    max_lag: int = 1,
 86    fdr: bool = False,
 87    ci: str = "parcorr",
 88    seed: int = 1,
 89    threads: int = 1,
 90) -> dict[str, Any]:
 91    names, columns = as_columns(data)
 92    return _validate_pcmci_alpha_sensitivity(
 93        names,
 94        columns,
 95        list(alphas),
 96        max_lag=max_lag,
 97        fdr=fdr,
 98        ci=ci,
 99        seed=seed,
100        threads=threads,
101    )
def validate_pcmci_block_bootstrap( data: Union[Mapping[str, Any], Any], *, max_lag: int = 1, alpha: float = 0.05, fdr: bool = False, ci: str = 'parcorr', replicates: int = 20, block_size: int = 20, seed: int = 1, threads: int = 1) -> dict[str, typing.Any]:
27def validate_pcmci_block_bootstrap(
28    data: Mapping[str, Any] | Any,
29    *,
30    max_lag: int = 1,
31    alpha: float = 0.05,
32    fdr: bool = False,
33    ci: str = "parcorr",
34    replicates: int = 20,
35    block_size: int = 20,
36    seed: int = 1,
37    threads: int = 1,
38) -> dict[str, Any]:
39    names, columns = as_columns(data)
40    return _validate_pcmci_block_bootstrap(
41        names,
42        columns,
43        max_lag=max_lag,
44        alpha=alpha,
45        fdr=fdr,
46        ci=ci,
47        replicates=replicates,
48        block_size=block_size,
49        seed=seed,
50        threads=threads,
51    )
def validate_pcmci_ci_sensitivity( data: Union[Mapping[str, Any], Any], ci_names: Sequence[str], *, max_lag: int = 1, alpha: float = 0.05, fdr: bool = False, seed: int = 1, threads: int = 1) -> dict[str, typing.Any]:
127def validate_pcmci_ci_sensitivity(
128    data: Mapping[str, Any] | Any,
129    ci_names: Sequence[str],
130    *,
131    max_lag: int = 1,
132    alpha: float = 0.05,
133    fdr: bool = False,
134    seed: int = 1,
135    threads: int = 1,
136) -> dict[str, Any]:
137    names, columns = as_columns(data)
138    return _validate_pcmci_ci_sensitivity(
139        names,
140        columns,
141        list(ci_names),
142        max_lag=max_lag,
143        alpha=alpha,
144        fdr=fdr,
145        seed=seed,
146        threads=threads,
147    )
def validate_pcmci_false_positive( data: Union[Mapping[str, Any], Any], *, max_lag: int = 1, alpha: float = 0.05, fdr: bool = False, ci: str = 'parcorr', transform: str = 'permute', replicates: int = 20, seed: int = 1, threads: int = 1) -> dict[str, typing.Any]:
54def validate_pcmci_false_positive(
55    data: Mapping[str, Any] | Any,
56    *,
57    max_lag: int = 1,
58    alpha: float = 0.05,
59    fdr: bool = False,
60    ci: str = "parcorr",
61    transform: str = "permute",
62    replicates: int = 20,
63    seed: int = 1,
64    threads: int = 1,
65) -> dict[str, Any]:
66    names, columns = as_columns(data)
67    return _validate_pcmci_false_positive(
68        names,
69        columns,
70        max_lag=max_lag,
71        alpha=alpha,
72        fdr=fdr,
73        ci=ci,
74        transform=transform,
75        replicates=replicates,
76        seed=seed,
77        threads=threads,
78    )
def validate_pcmci_lag_sensitivity( data: Union[Mapping[str, Any], Any], max_lags: Sequence[int], *, alpha: float = 0.05, fdr: bool = False, ci: str = 'parcorr', seed: int = 1, threads: int = 1) -> dict[str, typing.Any]:
104def validate_pcmci_lag_sensitivity(
105    data: Mapping[str, Any] | Any,
106    max_lags: Sequence[int],
107    *,
108    alpha: float = 0.05,
109    fdr: bool = False,
110    ci: str = "parcorr",
111    seed: int = 1,
112    threads: int = 1,
113) -> dict[str, Any]:
114    names, columns = as_columns(data)
115    return _validate_pcmci_lag_sensitivity(
116        names,
117        columns,
118        [int(m) for m in max_lags],
119        alpha=alpha,
120        fdr=fdr,
121        ci=ci,
122        seed=seed,
123        threads=threads,
124    )
def validate_pcmci_plus_orientation( data: Union[Mapping[str, Any], Any], *, max_lag: int = 1, alpha: float = 0.05, fdr: bool = False, ci: str = 'parcorr', replicates: int = 20, block_size: int = 20, seed: int = 1, threads: int = 1) -> dict[str, typing.Any]:
150def validate_pcmci_plus_orientation(
151    data: Mapping[str, Any] | Any,
152    *,
153    max_lag: int = 1,
154    alpha: float = 0.05,
155    fdr: bool = False,
156    ci: str = "parcorr",
157    replicates: int = 20,
158    block_size: int = 20,
159    seed: int = 1,
160    threads: int = 1,
161) -> dict[str, Any]:
162    names, columns = as_columns(data)
163    return _validate_pcmci_plus_orientation(
164        names,
165        columns,
166        max_lag=max_lag,
167        alpha=alpha,
168        fdr=fdr,
169        ci=ci,
170        replicates=replicates,
171        block_size=block_size,
172        seed=seed,
173        threads=threads,
174    )
def validate_regime_stability( data: Union[Mapping[str, Any], Any], regimes: Sequence[int], *, max_lag: int = 1, alpha: float = 0.05, fdr: bool = False, ci: str = 'parcorr', replicates: int = 10, block_size: int = 20, seed: int = 1, threads: int = 1) -> dict[str, typing.Any]:
227def validate_regime_stability(
228    data: Mapping[str, Any] | Any,
229    regimes: Sequence[int],
230    *,
231    max_lag: int = 1,
232    alpha: float = 0.05,
233    fdr: bool = False,
234    ci: str = "parcorr",
235    replicates: int = 10,
236    block_size: int = 20,
237    seed: int = 1,
238    threads: int = 1,
239) -> dict[str, Any]:
240    names, columns = as_columns(data)
241    return _validate_regime_stability(
242        names,
243        columns,
244        [int(r) for r in regimes],
245        max_lag=max_lag,
246        alpha=alpha,
247        fdr=fdr,
248        ci=ci,
249        replicates=replicates,
250        block_size=block_size,
251        seed=seed,
252        threads=threads,
253    )
def validate_synthetic_null_calibration( *, max_lag: int = 1, alpha: float = 0.05, fdr: bool = False, ci: str = 'parcorr', n_sim: int = 20, n_obs: int = 100, n_vars: int = 3, seed: int = 1, threads: int = 1) -> dict[str, typing.Any]:
177def validate_synthetic_null_calibration(
178    *,
179    max_lag: int = 1,
180    alpha: float = 0.05,
181    fdr: bool = False,
182    ci: str = "parcorr",
183    n_sim: int = 20,
184    n_obs: int = 100,
185    n_vars: int = 3,
186    seed: int = 1,
187    threads: int = 1,
188) -> dict[str, Any]:
189    return _validate_synthetic_null_calibration(
190        max_lag=max_lag,
191        alpha=alpha,
192        fdr=fdr,
193        ci=ci,
194        n_sim=n_sim,
195        n_obs=n_obs,
196        n_vars=n_vars,
197        seed=seed,
198        threads=threads,
199    )