kmlyyll commited on
Commit
39eaba2
·
verified ·
1 Parent(s): 5156b15

Upload epibarrett model bundle (lasso, targeted, multimodal + preprocessor)

Browse files
Files changed (3) hide show
  1. README.md +56 -0
  2. epibarrett_model.joblib +3 -0
  3. metrics.json +328 -0
README.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # epibarrett model card
2
+
3
+ Epigenetic early detection of Barrett's esophagus / esophageal adenocarcinoma
4
+ from DNA methylation.
5
+
6
+ ## Model description
7
+
8
+ This repository contains three scikit-learn pipelines trained on a biologically
9
+ calibrated HM450-style simulator:
10
+
11
+ - `lasso`: genome-wide moderated-t + L1 logistic panel
12
+ - `targeted`: VIM+CCNA1 two-gene assay analogue
13
+ - `multimodal`: methylation risk score + clinical covariates
14
+
15
+ All models are accompanied by a fitted `Preprocessor` (beta→M, probe QC,
16
+ median imputation) and the list of probe names expected at inference time.
17
+
18
+ ## Intended use
19
+
20
+ Research demonstration only. Not a medical device. The intended input is a
21
+ samples × probes beta-value DataFrame (HM450 or EPIC) plus optional clinical
22
+ covariates (age, sex_male, bmi, smoker, gerd).
23
+
24
+ ## How to use
25
+
26
+ ```python
27
+ import joblib
28
+ import pandas as pd
29
+
30
+ bundle = joblib.load("epibarrett_model.joblib")
31
+ lasso = bundle["lasso"]
32
+ preprocessor = bundle["preprocessor"]
33
+ probe_names = bundle["probe_names"]
34
+
35
+ # X_beta is a DataFrame of beta values with the same probe columns
36
+ M = preprocessor.transform(X_beta[probe_names])
37
+ proba = lasso.predict_proba(M)[:, 1]
38
+ ```
39
+
40
+ ## Training data
41
+
42
+ Trained on the simulator in `epibarrett.data.simulate` (seed 7). Replace with
43
+ real GEO cohorts (GSE81334, GSE104707, etc.) for a scientific study.
44
+
45
+ ## Performance (simulated demo)
46
+
47
+ | Regime | Model | AUROC | sens@spec90 | Brier |
48
+ |---|---|---|---|---|
49
+ | within | L1 panel | 0.950 | 0.873 | 0.098 |
50
+ | within | targeted VIM+CCNA1 | 0.914 | 0.754 | 0.121 |
51
+ | within | multimodal | 0.957 | 0.889 | 0.091 |
52
+ | external | L1 panel | 0.943 | 0.800 | 0.419 |
53
+
54
+ ## License
55
+
56
+ MIT — see the GitHub repository for details.
epibarrett_model.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f657e000742514ab3b675ac7142b0c27549ee47127094654f0cafd51adb26917
3
+ size 251528
metrics.json ADDED
@@ -0,0 +1,328 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "within.lasso": {
3
+ "auroc": 0.9503968253968255,
4
+ "auprc": 0.9537083978980874,
5
+ "brier": 0.09780938831091726,
6
+ "sensitivity_at_spec90": 0.873015873015873,
7
+ "specificity_at_sens90": 0.8548387096774194,
8
+ "n": 250,
9
+ "prevalence": 0.504,
10
+ "auroc_ci95": [
11
+ 0.9246015745007681,
12
+ 0.9740303379416283
13
+ ]
14
+ },
15
+ "within.gbm": {
16
+ "auroc": 0.8972094214029698,
17
+ "auprc": 0.9088239565472542,
18
+ "brier": 0.14035917875148912,
19
+ "sensitivity_at_spec90": 0.7142857142857143,
20
+ "specificity_at_sens90": 0.6290322580645161,
21
+ "n": 250,
22
+ "prevalence": 0.504,
23
+ "auroc_ci95": [
24
+ 0.8586741551459294,
25
+ 0.9322244623655914
26
+ ]
27
+ },
28
+ "within.targeted": {
29
+ "auroc": 0.9139784946236559,
30
+ "auprc": 0.9239706329613951,
31
+ "brier": 0.12130136959989281,
32
+ "sensitivity_at_spec90": 0.753968253968254,
33
+ "specificity_at_sens90": 0.6854838709677419,
34
+ "n": 250,
35
+ "prevalence": 0.504,
36
+ "auroc_ci95": [
37
+ 0.8787090373783922,
38
+ 0.9436795954941117
39
+ ]
40
+ },
41
+ "within.multimodal": {
42
+ "auroc": 0.9567332309267793,
43
+ "auprc": 0.9589696832413457,
44
+ "brier": 0.09072201619977514,
45
+ "sensitivity_at_spec90": 0.8888888888888888,
46
+ "specificity_at_sens90": 0.8870967741935484,
47
+ "n": 250,
48
+ "prevalence": 0.504,
49
+ "auroc_ci95": [
50
+ 0.933173323092678,
51
+ 0.9761952764976959
52
+ ]
53
+ },
54
+ "within.clinical_only": {
55
+ "auroc": 0.6690988223246288,
56
+ "auprc": 0.6859693850230023,
57
+ "brier": 0.22678546064067975,
58
+ "sensitivity_at_spec90": 0.2698412698412698,
59
+ "specificity_at_sens90": 0.18548387096774194,
60
+ "n": 250,
61
+ "prevalence": 0.504
62
+ },
63
+ "external.lasso": {
64
+ "auroc": 0.9423728813559322,
65
+ "auprc": 0.738482943780696,
66
+ "brier": 0.4649400820862006,
67
+ "sensitivity_at_spec90": 0.8,
68
+ "specificity_at_sens90": 0.864406779661017,
69
+ "n": 192,
70
+ "prevalence": 0.078125,
71
+ "auroc_ci95": [
72
+ 0.8805743879472693,
73
+ 0.9864406779661017
74
+ ]
75
+ },
76
+ "external.gbm": {
77
+ "auroc": 0.9212806026365348,
78
+ "auprc": 0.5820216624108571,
79
+ "brier": 0.28547947784607763,
80
+ "sensitivity_at_spec90": 0.8666666666666667,
81
+ "specificity_at_sens90": 0.6666666666666666,
82
+ "n": 192,
83
+ "prevalence": 0.078125,
84
+ "auroc_ci95": [
85
+ 0.8418079096045198,
86
+ 0.9834274952919021
87
+ ]
88
+ },
89
+ "selected_panel": [
90
+ {
91
+ "probe": "cg_ZNF345_2",
92
+ "gene": "ZNF345",
93
+ "coef": 0.7035181247656423
94
+ },
95
+ {
96
+ "probe": "cg_TFPI2_1",
97
+ "gene": "TFPI2",
98
+ "coef": 0.5380634042743031
99
+ },
100
+ {
101
+ "probe": "cg_VIM_1",
102
+ "gene": "VIM",
103
+ "coef": 0.478083363737724
104
+ },
105
+ {
106
+ "probe": "cg_CCNA1_3",
107
+ "gene": "CCNA1",
108
+ "coef": 0.4403272227367819
109
+ },
110
+ {
111
+ "probe": "cg_TAC1_1",
112
+ "gene": "TAC1",
113
+ "coef": 0.4207556722110058
114
+ },
115
+ {
116
+ "probe": "cg_VIM_2",
117
+ "gene": "VIM",
118
+ "coef": 0.3264920743253056
119
+ },
120
+ {
121
+ "probe": "cg_TFPI2_2",
122
+ "gene": "TFPI2",
123
+ "coef": 0.3120380728741678
124
+ },
125
+ {
126
+ "probe": "cg_NELL1_1",
127
+ "gene": "NELL1",
128
+ "coef": 0.3008969535191267
129
+ },
130
+ {
131
+ "probe": "cg_VIM_3",
132
+ "gene": "VIM",
133
+ "coef": 0.27840107854419205
134
+ },
135
+ {
136
+ "probe": "cg_CCNA1_2",
137
+ "gene": "CCNA1",
138
+ "coef": 0.18589863770343062
139
+ },
140
+ {
141
+ "probe": "bg_01511",
142
+ "gene": "background",
143
+ "coef": -0.15830800052901345
144
+ },
145
+ {
146
+ "probe": "cg_ZNF345_1",
147
+ "gene": "ZNF345",
148
+ "coef": 0.14178484941506977
149
+ },
150
+ {
151
+ "probe": "bg_01691",
152
+ "gene": "background",
153
+ "coef": 0.13350253242783736
154
+ },
155
+ {
156
+ "probe": "bg_01367",
157
+ "gene": "background",
158
+ "coef": 0.12902553267595554
159
+ },
160
+ {
161
+ "probe": "bg_01532",
162
+ "gene": "background",
163
+ "coef": -0.12201077014600044
164
+ },
165
+ {
166
+ "probe": "bg_00290",
167
+ "gene": "background",
168
+ "coef": -0.1101334005361793
169
+ },
170
+ {
171
+ "probe": "bg_00733",
172
+ "gene": "background",
173
+ "coef": 0.10831257522986705
174
+ },
175
+ {
176
+ "probe": "bg_00105",
177
+ "gene": "background",
178
+ "coef": -0.10737308224671371
179
+ },
180
+ {
181
+ "probe": "bg_00509",
182
+ "gene": "background",
183
+ "coef": 0.10623849312332573
184
+ },
185
+ {
186
+ "probe": "bg_00686",
187
+ "gene": "background",
188
+ "coef": -0.09256552909242247
189
+ },
190
+ {
191
+ "probe": "bg_00994",
192
+ "gene": "background",
193
+ "coef": 0.08975507656339371
194
+ },
195
+ {
196
+ "probe": "bg_01544",
197
+ "gene": "background",
198
+ "coef": -0.0880138674460795
199
+ },
200
+ {
201
+ "probe": "bg_00140",
202
+ "gene": "background",
203
+ "coef": 0.08341806735469658
204
+ },
205
+ {
206
+ "probe": "bg_00641",
207
+ "gene": "background",
208
+ "coef": -0.08049141437016215
209
+ },
210
+ {
211
+ "probe": "bg_00080",
212
+ "gene": "background",
213
+ "coef": -0.07966493645195764
214
+ }
215
+ ],
216
+ "gbm_top_features": [
217
+ {
218
+ "probe": "cg_ZNF345_2",
219
+ "gene": "ZNF345",
220
+ "importance": 0.44761625569077046
221
+ },
222
+ {
223
+ "probe": "cg_CCNA1_3",
224
+ "gene": "CCNA1",
225
+ "importance": 0.3919606170447708
226
+ },
227
+ {
228
+ "probe": "cg_TFPI2_1",
229
+ "gene": "TFPI2",
230
+ "importance": 0.33921190341330115
231
+ },
232
+ {
233
+ "probe": "cg_VIM_1",
234
+ "gene": "VIM",
235
+ "importance": 0.2951477251550466
236
+ },
237
+ {
238
+ "probe": "cg_TAC1_1",
239
+ "gene": "TAC1",
240
+ "importance": 0.2890054574210354
241
+ },
242
+ {
243
+ "probe": "cg_TFPI2_2",
244
+ "gene": "TFPI2",
245
+ "importance": 0.25664946466597705
246
+ },
247
+ {
248
+ "probe": "cg_VIM_3",
249
+ "gene": "VIM",
250
+ "importance": 0.1199790025149959
251
+ },
252
+ {
253
+ "probe": "cg_NELL1_1",
254
+ "gene": "NELL1",
255
+ "importance": 0.11122904068379584
256
+ },
257
+ {
258
+ "probe": "cg_CCNA1_2",
259
+ "gene": "CCNA1",
260
+ "importance": 0.11077148485183563
261
+ },
262
+ {
263
+ "probe": "cg_CCNA1_1",
264
+ "gene": "CCNA1",
265
+ "importance": 0.10342810589743917
266
+ },
267
+ {
268
+ "probe": "cg_SST_1",
269
+ "gene": "SST",
270
+ "importance": 0.09712306979141481
271
+ },
272
+ {
273
+ "probe": "bg_00924",
274
+ "gene": "background",
275
+ "importance": 0.09479481971948106
276
+ },
277
+ {
278
+ "probe": "cg_VIM_2",
279
+ "gene": "VIM",
280
+ "importance": 0.09407314074850304
281
+ },
282
+ {
283
+ "probe": "bg_00771",
284
+ "gene": "background",
285
+ "importance": 0.08693690495060578
286
+ },
287
+ {
288
+ "probe": "cg_ZNF345_1",
289
+ "gene": "ZNF345",
290
+ "importance": 0.08437516401768441
291
+ },
292
+ {
293
+ "probe": "bg_01581",
294
+ "gene": "background",
295
+ "importance": 0.07109450882190814
296
+ },
297
+ {
298
+ "probe": "bg_00944",
299
+ "gene": "background",
300
+ "importance": 0.039676060837992425
301
+ },
302
+ {
303
+ "probe": "bg_00757",
304
+ "gene": "background",
305
+ "importance": 0.03689797391343528
306
+ },
307
+ {
308
+ "probe": "bg_01281",
309
+ "gene": "background",
310
+ "importance": 0.034912264438296474
311
+ },
312
+ {
313
+ "probe": "bg_00720",
314
+ "gene": "background",
315
+ "importance": 0.0338130151909994
316
+ }
317
+ ],
318
+ "_summary": {
319
+ "discovery_cohort": "GSE81334_like",
320
+ "external_cohort": "GSE104707_like",
321
+ "n_discovery": 250,
322
+ "n_external": 192,
323
+ "n_probes_after_qc": 2074,
324
+ "n_samples_dropped_qc": 18,
325
+ "discovery_prevalence": 0.504,
326
+ "external_prevalence": 0.078125
327
+ }
328
+ }