peeksafe 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +325 -0
- package/LICENSE +190 -0
- package/NOTICE +78 -0
- package/README.md +490 -2
- package/RESEARCH-NOTES.md +274 -0
- package/dist/baseline.d.ts +45 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +49 -0
- package/dist/baseline.js.map +1 -0
- package/dist/check.d.ts +64 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +172 -0
- package/dist/check.js.map +1 -0
- package/dist/cluster.d.ts +328 -0
- package/dist/cluster.d.ts.map +1 -0
- package/dist/cluster.js +606 -0
- package/dist/cluster.js.map +1 -0
- package/dist/errors.d.ts +108 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +192 -0
- package/dist/errors.js.map +1 -0
- package/dist/evidence.d.ts +15 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +30 -0
- package/dist/evidence.js.map +1 -0
- package/dist/frontier.d.ts +271 -0
- package/dist/frontier.d.ts.map +1 -0
- package/dist/frontier.js +505 -0
- package/dist/frontier.js.map +1 -0
- package/dist/gate.d.ts +175 -0
- package/dist/gate.d.ts.map +1 -0
- package/dist/gate.js +200 -0
- package/dist/gate.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/plan.d.ts +280 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +626 -0
- package/dist/plan.js.map +1 -0
- package/dist/rand.d.ts +17 -0
- package/dist/rand.d.ts.map +1 -0
- package/dist/rand.js +104 -0
- package/dist/rand.js.map +1 -0
- package/dist/stats.d.ts +401 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +1304 -0
- package/dist/stats.js.map +1 -0
- package/dist/stop.d.ts +164 -0
- package/dist/stop.d.ts.map +1 -0
- package/dist/stop.js +270 -0
- package/dist/stop.js.map +1 -0
- package/package.json +62 -3
- package/src/baseline.ts +72 -0
- package/src/check.ts +238 -0
- package/src/cluster.ts +842 -0
- package/src/errors.ts +275 -0
- package/src/evidence.ts +62 -0
- package/src/frontier.ts +837 -0
- package/src/gate.ts +363 -0
- package/src/index.ts +206 -0
- package/src/plan.ts +968 -0
- package/src/rand.ts +137 -0
- package/src/stats.ts +1663 -0
- package/src/stop.ts +464 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cluster.ts: the suite-level effect, with the cases treated as what they are.
|
|
3
|
+
*
|
|
4
|
+
* ## The bug this module exists to fix
|
|
5
|
+
*
|
|
6
|
+
* The obvious summary of a suite effect is an ordinary normal interval over the
|
|
7
|
+
* per-case differences:
|
|
8
|
+
*
|
|
9
|
+
* mean ± 1.96 · sd / √n with n = 200 cases
|
|
10
|
+
*
|
|
11
|
+
* That formula is only correct if the 200 numbers are 200 independent draws.
|
|
12
|
+
* They usually are not. A suite of **40 case files, each expanded into 5
|
|
13
|
+
* variants**, is typical: `extract.pricing#saas` and `extract.pricing#api`
|
|
14
|
+
* share a prompt template, a grader, an expectation shape and a failure mode.
|
|
15
|
+
* When one moves, its four siblings move with it. The effective number of
|
|
16
|
+
* independent observations is closer to 40 than to 200, the true standard error
|
|
17
|
+
* is larger than √(s²/200), and the reported interval is **too narrow**.
|
|
18
|
+
*
|
|
19
|
+
* A too-narrow interval on the headline number is the exact failure this whole
|
|
20
|
+
* package exists to prevent, so it gets a proper estimator rather than a fudge
|
|
21
|
+
* factor.
|
|
22
|
+
*
|
|
23
|
+
* ## What is estimated here, and what is not
|
|
24
|
+
*
|
|
25
|
+
* Clustering touches **only the suite-level (and family-level) summary**.
|
|
26
|
+
* Specifically:
|
|
27
|
+
*
|
|
28
|
+
* affected the across-case mean difference and its interval
|
|
29
|
+
* (`clusteredEffect`), plus any family-level roll-up.
|
|
30
|
+
*
|
|
31
|
+
* NOT affected every per-case quantity. Each case's e-value is its own
|
|
32
|
+
* self-contained test on that case's own runs; nothing about
|
|
33
|
+
* case *A* enters case *B*'s likelihood ratio. And the
|
|
34
|
+
* multiplicity correction is **e-BH**, which controls FDR under
|
|
35
|
+
* *arbitrary* dependence between the tested hypotheses, that
|
|
36
|
+
* is the whole reason it was chosen over BH. So `gate`'s
|
|
37
|
+
* verdict, its regressed cases and its thresholds are all
|
|
38
|
+
* bit-for-bit identical whether or not the cases cluster.
|
|
39
|
+
*
|
|
40
|
+
* In other words: clustering makes the *description* honest. It does not, and
|
|
41
|
+
* must not, move the *decision*.
|
|
42
|
+
*
|
|
43
|
+
* ## Two estimators, because they fail in different directions
|
|
44
|
+
*
|
|
45
|
+
* **CR2 (the headline).** A cluster-robust sandwich with the Bell-McCaffrey
|
|
46
|
+
* bias reduction. For the intercept-only model that a mean is, the hat matrix
|
|
47
|
+
* is H = J/n, so each cluster's leverage block is (I − J_{n_g}/n) and the CR2
|
|
48
|
+
* adjustment `A_g = (I − H_gg)^{-1/2}` collapses to a scalar on the cluster's
|
|
49
|
+
* residual sum:
|
|
50
|
+
*
|
|
51
|
+
* Var̂(ȳ) = (1/n²) · Σ_g (Σ_{i∈g} ê_i)² / (1 − n_g/n)
|
|
52
|
+
*
|
|
53
|
+
* Assumption-light: it needs the *families* to be independent of each other and
|
|
54
|
+
* nothing at all about the correlation structure *inside* a family. It does not
|
|
55
|
+
* assume the family effects are normal, or exchangeable, or even
|
|
56
|
+
* identically distributed. Paired with Bell-McCaffrey/Satterthwaite degrees of
|
|
57
|
+
* freedom (which, for equal-sized families, reduce exactly to G − 1; see the
|
|
58
|
+
* derivation in the comment above `dfRaw` below) it is the estimator you want
|
|
59
|
+
* when there are 40 clusters rather than 4,000.
|
|
60
|
+
*
|
|
61
|
+
* **Random effects (the cross-check).** The one-way model
|
|
62
|
+
* y_gi = μ + u_g + e_gi with the ANOVA (Swamy-Arora) estimators for τ² and σ².
|
|
63
|
+
* More efficient *if* its assumptions hold, and it yields the number that
|
|
64
|
+
* actually explains the width change: the intra-class correlation
|
|
65
|
+
* ρ = τ²/(τ² + σ²). If the two estimators disagree materially, that is itself
|
|
66
|
+
* information, and `compareEstimators` says so rather than picking a winner.
|
|
67
|
+
*
|
|
68
|
+
* ## The design effect
|
|
69
|
+
*
|
|
70
|
+
* `designEffect` = (clustered SE / naive iid SE)². It is the factor by which
|
|
71
|
+
* the naive analysis overstated its own information, "these 200 cases carry
|
|
72
|
+
* the information of 200/DEFF independent ones". For roughly equal families of
|
|
73
|
+
* size k it tracks the textbook 1 + (k − 1)ρ, which is the sanity check the
|
|
74
|
+
* tests assert.
|
|
75
|
+
*/
|
|
76
|
+
import { type Interval } from "./stats.js";
|
|
77
|
+
/**
|
|
78
|
+
* The cluster a case belongs to: its **case file**.
|
|
79
|
+
*
|
|
80
|
+
* Variant ids are expected as `<fileId>#<variant>`, so everything before
|
|
81
|
+
* the first `#` is the file, and the file is the unit an author actually wrote.
|
|
82
|
+
* A case with no `#` is its own family of one, which is correct, not a
|
|
83
|
+
* degenerate case: an unexpanded case file shares its template with nobody.
|
|
84
|
+
*/
|
|
85
|
+
export declare function caseFamily(caseId: string): string;
|
|
86
|
+
/**
|
|
87
|
+
* The cluster key for a case: the one it **declares**, or its case file.
|
|
88
|
+
*
|
|
89
|
+
* `caseFamily` sees exactly one reason two cases correlate, that they were
|
|
90
|
+
* minted from the same file, and is blind to every other: a shared grader, a
|
|
91
|
+
* shared fixture directory, one flaky tool that six unrelated cases happen to
|
|
92
|
+
* call. Those cases are correlated too, and the interval will be too narrow
|
|
93
|
+
* again for a reason the id cannot express. So a case may declare its own key.
|
|
94
|
+
*
|
|
95
|
+
* A wrong key is worse than no key, which is why `clusterKeyDiagnostic` ships
|
|
96
|
+
* alongside: declaring two genuinely independent cases into one family throws
|
|
97
|
+
* away real information and widens the interval for nothing, and the only way
|
|
98
|
+
* to know is to look at the ICC the declared grouping actually exhibits.
|
|
99
|
+
*/
|
|
100
|
+
export declare const clusterKey: (c: {
|
|
101
|
+
id: string;
|
|
102
|
+
cluster?: string;
|
|
103
|
+
}) => string;
|
|
104
|
+
export interface ClusterObservation {
|
|
105
|
+
/** the family this observation belongs to */
|
|
106
|
+
cluster: string;
|
|
107
|
+
value: number;
|
|
108
|
+
}
|
|
109
|
+
/** Group observations by cluster, preserving first-seen order. */
|
|
110
|
+
export declare function groupByCluster(obs: ClusterObservation[]): Map<string, number[]>;
|
|
111
|
+
export interface ClusteredMean extends Interval {
|
|
112
|
+
/** the mean itself, same number the naive estimator reports */
|
|
113
|
+
point: number;
|
|
114
|
+
low: number;
|
|
115
|
+
high: number;
|
|
116
|
+
/** number of *cases* behind the estimate */
|
|
117
|
+
observations: number;
|
|
118
|
+
/** number of *independent* units behind the estimate, the one that matters */
|
|
119
|
+
clusters: number;
|
|
120
|
+
largestCluster: number;
|
|
121
|
+
meanClusterSize: number;
|
|
122
|
+
/** CR2 cluster-robust standard error of the mean */
|
|
123
|
+
se: number;
|
|
124
|
+
/** the iid standard error the naive interval used, s/√n */
|
|
125
|
+
naiveSe: number;
|
|
126
|
+
/** (se / naiveSe)², the factor by which the naive analysis overstated its information */
|
|
127
|
+
designEffect: number;
|
|
128
|
+
/** how much wider the honest interval is, half-width to half-width */
|
|
129
|
+
widthRatio: number;
|
|
130
|
+
/** Bell-McCaffrey / Satterthwaite degrees of freedom */
|
|
131
|
+
df: number;
|
|
132
|
+
/** the t multiplier actually used (vs `normalQuantile` for the naive one) */
|
|
133
|
+
tCritical: number;
|
|
134
|
+
/** how many independent cases this suite is *worth*, n / designEffect */
|
|
135
|
+
effectiveSampleSize: number;
|
|
136
|
+
method: "CR2";
|
|
137
|
+
/** set when the estimate could not be formed; `low`/`high` are then vacuous */
|
|
138
|
+
degenerate: string | null;
|
|
139
|
+
}
|
|
140
|
+
/** The naive iid interval, kept so the two can be printed side by side. */
|
|
141
|
+
export declare function iidMean(values: number[], level?: number): Interval;
|
|
142
|
+
/**
|
|
143
|
+
* CR2 cluster-robust interval for a mean, with Bell-McCaffrey degrees of
|
|
144
|
+
* freedom. See the module header for the derivation; the short version is that
|
|
145
|
+
* for an intercept-only design the whole apparatus collapses to
|
|
146
|
+
*
|
|
147
|
+
* Var̂ = (1/n²) Σ_g (Σ_{i∈g} ê_i)² / (1 − n_g/n)
|
|
148
|
+
*
|
|
149
|
+
* and the Satterthwaite df to a closed form in the cluster sizes alone.
|
|
150
|
+
*/
|
|
151
|
+
export declare function clusterRobustMean(obs: ClusterObservation[], level?: number): ClusteredMean;
|
|
152
|
+
export interface RandomEffectsMean extends Interval {
|
|
153
|
+
clusters: number;
|
|
154
|
+
observations: number;
|
|
155
|
+
/** between-family variance τ̂² (ANOVA / Swamy-Arora, floored at 0) */
|
|
156
|
+
tauSquared: number;
|
|
157
|
+
/** within-family variance σ̂² */
|
|
158
|
+
sigmaSquared: number;
|
|
159
|
+
/** intra-class correlation τ̂²/(τ̂²+σ̂²), the number that explains the widening */
|
|
160
|
+
icc: number;
|
|
161
|
+
se: number;
|
|
162
|
+
df: number;
|
|
163
|
+
method: "random-effects";
|
|
164
|
+
degenerate: string | null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* One-way random-effects (hierarchical) estimate of the same mean.
|
|
168
|
+
*
|
|
169
|
+
* y_gi = μ + u_g + e_gi, u_g ~ (0, τ²), e_gi ~ (0, σ²)
|
|
170
|
+
*
|
|
171
|
+
* τ² and σ² come from the ANOVA decomposition (the Swamy-Arora estimator,
|
|
172
|
+
* unbiased and closed-form, and it does not need the normality that REML would
|
|
173
|
+
* lean on). μ̂ is the GLS weighted mean of the family means with
|
|
174
|
+
* w_g = 1/(τ² + σ²/n_g), so its variance is 1/Σw_g.
|
|
175
|
+
*
|
|
176
|
+
* Two properties worth knowing before trusting it:
|
|
177
|
+
* - at τ̂² = 0 it degenerates **exactly** to the naive iid interval, which is
|
|
178
|
+
* the correct behaviour: no between-family variance means the cases really
|
|
179
|
+
* were exchangeable;
|
|
180
|
+
* - it weights families by information rather than by size, so unlike the
|
|
181
|
+
* unweighted mean it is not the same point estimate as CR2 when families
|
|
182
|
+
* differ in size. That difference is a feature and it is reported.
|
|
183
|
+
*/
|
|
184
|
+
export declare function randomEffectsMean(obs: ClusterObservation[], level?: number): RandomEffectsMean;
|
|
185
|
+
export interface FamilyEffect {
|
|
186
|
+
family: string;
|
|
187
|
+
cases: number;
|
|
188
|
+
/** unweighted mean of the family's per-case effects */
|
|
189
|
+
point: number;
|
|
190
|
+
/**
|
|
191
|
+
* Spread of the family's own cases. Deliberately **not** an interval: the
|
|
192
|
+
* variants inside a family are the correlated things, so an interval over
|
|
193
|
+
* five of them would repeat the very mistake this module fixes, one level
|
|
194
|
+
* down. A family of five variants is one observation, not five.
|
|
195
|
+
*/
|
|
196
|
+
sd: number;
|
|
197
|
+
min: number;
|
|
198
|
+
max: number;
|
|
199
|
+
}
|
|
200
|
+
export interface ClusteredEffect {
|
|
201
|
+
/** the honest headline: CR2 with small-cluster degrees of freedom */
|
|
202
|
+
cr2: ClusteredMean;
|
|
203
|
+
/** the hierarchical cross-check, and where the ICC comes from */
|
|
204
|
+
randomEffects: RandomEffectsMean;
|
|
205
|
+
/** the naive iid interval, which assumes every case is independent */
|
|
206
|
+
naive: Interval;
|
|
207
|
+
/** (clustered SE / naive SE)² */
|
|
208
|
+
designEffect: number;
|
|
209
|
+
/** how much wider the honest interval is */
|
|
210
|
+
widthRatio: number;
|
|
211
|
+
icc: number;
|
|
212
|
+
clusters: number;
|
|
213
|
+
observations: number;
|
|
214
|
+
/** per case-file roll-up, point estimates only, and the docs say why */
|
|
215
|
+
families: FamilyEffect[];
|
|
216
|
+
/**
|
|
217
|
+
* True when the naive interval excluded zero and the honest one does not.
|
|
218
|
+
* This is the finding: a claim that "the suite moved" which does not survive
|
|
219
|
+
* being told that the cases are not independent.
|
|
220
|
+
*/
|
|
221
|
+
signFlippedByClustering: boolean;
|
|
222
|
+
/** one line an operator can read without knowing what CR2 is */
|
|
223
|
+
headline: string;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* The whole suite-level story in one object: the honest interval, the naive one
|
|
227
|
+
* it replaces, the factor between them, and whether swapping them changes what
|
|
228
|
+
* a reader would conclude.
|
|
229
|
+
*/
|
|
230
|
+
export declare function clusteredEffect(obs: ClusterObservation[], level?: number): ClusteredEffect;
|
|
231
|
+
/**
|
|
232
|
+
* Do the two estimators tell the same story? They rest on different
|
|
233
|
+
* assumptions, so agreement is evidence and disagreement is a warning worth
|
|
234
|
+
* printing rather than resolving by fiat.
|
|
235
|
+
*/
|
|
236
|
+
export declare function compareEstimators(e: ClusteredEffect): {
|
|
237
|
+
agree: boolean;
|
|
238
|
+
/** ratio of the two standard errors, robust ÷ model-based */
|
|
239
|
+
seRatio: number;
|
|
240
|
+
note: string;
|
|
241
|
+
};
|
|
242
|
+
export interface GroupingSummary {
|
|
243
|
+
key: string;
|
|
244
|
+
/** why this grouping has no estimable interval, when it has none */
|
|
245
|
+
degenerate: string | null;
|
|
246
|
+
clusters: number;
|
|
247
|
+
meanClusterSize: number;
|
|
248
|
+
/**
|
|
249
|
+
* The ANOVA intra-class correlation, **only when `iccEstimable`**. With one
|
|
250
|
+
* case per family σ̂² is 0 by construction and this comes out at exactly 1,
|
|
251
|
+
* which is an artifact of the decomposition and not a measurement: a grouping
|
|
252
|
+
* of singletons says nothing at all about within-family correlation. Read the
|
|
253
|
+
* flag before the number.
|
|
254
|
+
*/
|
|
255
|
+
icc: number;
|
|
256
|
+
designEffect: number;
|
|
257
|
+
/** how much wider this grouping's interval is than the iid one. Not 1/DEFF:
|
|
258
|
+
* a coarse grouping also costs degrees of freedom, and a few large clusters
|
|
259
|
+
* can have a *smaller* design effect and a *much wider* interval. */
|
|
260
|
+
widthRatio: number;
|
|
261
|
+
se: number;
|
|
262
|
+
/** cases per independent unit, `observations / designEffect` */
|
|
263
|
+
effectiveSampleSize: number;
|
|
264
|
+
/** false when the random-effects fit cannot separate τ² from σ², so `icc` is not a measurement */
|
|
265
|
+
iccEstimable: boolean;
|
|
266
|
+
}
|
|
267
|
+
export interface ClusterKeyDiagnostic {
|
|
268
|
+
declared: GroupingSummary;
|
|
269
|
+
/** the same observations grouped by case file, which is what ships by default */
|
|
270
|
+
fallback: GroupingSummary;
|
|
271
|
+
/**
|
|
272
|
+
* The declared grouping is *coarser* than the fallback and its groups show no
|
|
273
|
+
* material correlation, it merged cases that do not move together, and got
|
|
274
|
+
* nothing for it.
|
|
275
|
+
*/
|
|
276
|
+
mergesUncorrelatedCases: boolean;
|
|
277
|
+
/**
|
|
278
|
+
* …and the resulting interval is **narrower** than the default's, on too few
|
|
279
|
+
* clusters for CR2 to be trusted. This is the dangerous direction, and it was
|
|
280
|
+
* not the one the first version of this diagnostic looked for: a coarse key
|
|
281
|
+
* with near-zero ICC can have a design effect *below* 1 and produce a tighter
|
|
282
|
+
* interval than the honest one, which is the exact failure `cluster.ts` was
|
|
283
|
+
* written to remove, reintroduced by a user-supplied key.
|
|
284
|
+
*/
|
|
285
|
+
narrowsOnTooFewClusters: boolean;
|
|
286
|
+
/**
|
|
287
|
+
* The mirror image, and the one the first two flags cannot see because both
|
|
288
|
+
* require the declared key to be *coarser*: a key that is **finer** than the
|
|
289
|
+
* case-file default, splitting apart families that do move together, and
|
|
290
|
+
* buying a narrower interval with the split. It is the same too-narrow
|
|
291
|
+
* headline `narrowsOnTooFewClusters` catches, arrived at from the other side,
|
|
292
|
+
* and it is not a small effect: dissolving eight ten-variant files into
|
|
293
|
+
* eighty singletons takes the interval from 3.90× the iid one to 1.02×, a
|
|
294
|
+
* claim that the suite carries eighty independent cases' worth of evidence
|
|
295
|
+
* when it carries about eight. Both figures are asserted in
|
|
296
|
+
* `cluster.test.ts`.
|
|
297
|
+
*/
|
|
298
|
+
narrowsBySplitting: boolean;
|
|
299
|
+
/** True when the declared grouping found correlation the case ids could not see. */
|
|
300
|
+
findsHiddenCorrelation: boolean;
|
|
301
|
+
verdict: string;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Below this many clusters, a cluster-robust standard error is optimistic even
|
|
305
|
+
* with small-cluster degrees of freedom. Standard practice; `compareEstimators`
|
|
306
|
+
* says the same thing from the other direction.
|
|
307
|
+
*/
|
|
308
|
+
export declare const MIN_TRUSTWORTHY_CLUSTERS = 20;
|
|
309
|
+
/**
|
|
310
|
+
* Does a user-declared cluster key carry anything?
|
|
311
|
+
*
|
|
312
|
+
* The honest answer is a comparison, not a number: the same observations are
|
|
313
|
+
* grouped both ways and the intra-class correlation of each grouping is
|
|
314
|
+
* reported. A declared key that merges cases which do not in fact move together
|
|
315
|
+
* shows an ICC near zero while having *fewer, larger* clusters than the
|
|
316
|
+
* fallback, it has thrown away real information and widened the interval to
|
|
317
|
+
* pay for it. A declared key that finds correlation the case ids could not see
|
|
318
|
+
* shows a higher ICC and a larger design effect, and is doing its job. A
|
|
319
|
+
* declared key that is *finer* than the fallback, splitting apart files whose
|
|
320
|
+
* variants do move together, narrows the interval instead, and that is the
|
|
321
|
+
* dangerous direction rather than the merely wasteful one.
|
|
322
|
+
*
|
|
323
|
+
* Neither outcome is corrected automatically. A cluster key is a claim about
|
|
324
|
+
* the world and only the person who made it can say whether it is true; this
|
|
325
|
+
* says what the data thinks of it.
|
|
326
|
+
*/
|
|
327
|
+
export declare function clusterKeyDiagnostic(declared: ClusterObservation[], fallback: ClusterObservation[]): ClusterKeyDiagnostic;
|
|
328
|
+
//# sourceMappingURL=cluster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../src/cluster.ts"],"names":[],"mappings":"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"}
|