medsci-skills 5.27.0 → 5.28.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.
Files changed (38) hide show
  1. package/metadata/distribution_files.json +113 -38
  2. package/metadata/distribution_manifest.json +1 -1
  3. package/package.json +1 -1
  4. package/skills/analyze-stats/SKILL.md +6 -6
  5. package/skills/analyze-stats/references/table-standards/table-types/incremental_value.md +71 -27
  6. package/skills/deidentify/deidentify.py +22 -12
  7. package/skills/deidentify/tests/test_deidentify_scan.sh +65 -0
  8. package/skills/find-journal/references/journal_profiles/Annals_of_Oncology.md +47 -0
  9. package/skills/find-journal/references/journal_profiles/BJR_Case_Reports.md +1 -1
  10. package/skills/find-journal/references/journal_profiles/BMJ_Case_Reports.md +1 -1
  11. package/skills/find-journal/references/journal_profiles/CVIR.md +1 -1
  12. package/skills/find-journal/references/journal_profiles/Cancer_Research_and_Treatment.md +47 -0
  13. package/skills/find-journal/references/journal_profiles/Chest.md +1 -1
  14. package/skills/find-journal/references/journal_profiles/Clinical_Cancer_Research.md +53 -0
  15. package/skills/find-journal/references/journal_profiles/Cureus.md +1 -1
  16. package/skills/find-journal/references/journal_profiles/ESMO_Open.md +49 -0
  17. package/skills/find-journal/references/journal_profiles/Journal_of_Breast_Cancer.md +51 -0
  18. package/skills/find-journal/references/journal_profiles/Journal_of_Clinical_Oncology.md +51 -0
  19. package/skills/find-journal/references/journal_profiles/Journal_of_Medical_Case_Reports.md +1 -1
  20. package/skills/find-journal/references/journal_profiles/Radiology_Case_Reports.md +1 -1
  21. package/skills/find-journal/references/journal_profiles/The_Lancet_Digital_Health.md +1 -1
  22. package/skills/find-journal/references/journal_profiles/npj_Breast_Cancer.md +50 -0
  23. package/skills/make-figures/references/exemplar_plots/README.md +6 -0
  24. package/skills/make-figures/references/exemplar_plots/shap_beeswarm.md +60 -0
  25. package/skills/write-paper/references/journal_profiles/Annals_of_Oncology.md +141 -0
  26. package/skills/write-paper/references/journal_profiles/Cancer_Research_and_Treatment.md +138 -0
  27. package/skills/write-paper/references/journal_profiles/Chest.md +1 -1
  28. package/skills/write-paper/references/journal_profiles/Clinical_Cancer_Research.md +154 -0
  29. package/skills/write-paper/references/journal_profiles/ESMO_Open.md +135 -0
  30. package/skills/write-paper/references/journal_profiles/JNIS.md +1 -1
  31. package/skills/write-paper/references/journal_profiles/Journal_of_Breast_Cancer.md +141 -0
  32. package/skills/write-paper/references/journal_profiles/Journal_of_Clinical_Oncology.md +154 -0
  33. package/skills/write-paper/references/journal_profiles/Journal_of_Stroke.md +1 -1
  34. package/skills/write-paper/references/journal_profiles/Liver_International.md +1 -1
  35. package/skills/write-paper/references/journal_profiles/NEJM_AI.md +1 -1
  36. package/skills/write-paper/references/journal_profiles/Stroke.md +1 -1
  37. package/skills/write-paper/references/journal_profiles/The_Lancet_Digital_Health.md +1 -1
  38. package/skills/write-paper/references/journal_profiles/npj_Breast_Cancer.md +143 -0
@@ -183,8 +183,8 @@
183
183
  },
184
184
  {
185
185
  "path": "skills/analyze-stats/SKILL.md",
186
- "size": 60456,
187
- "sha256": "c541c8811b918bb5b5cb380297a52659b4bda88537841574dc1272a8f7918aa8"
186
+ "size": 60966,
187
+ "sha256": "dca033657405001ba3e6f421a258edd1c9cc17c62e7661d0f987109cd4db33cf"
188
188
  },
189
189
  {
190
190
  "path": "skills/analyze-stats/references/analysis_guides/agreement_reliability.md",
@@ -338,8 +338,8 @@
338
338
  },
339
339
  {
340
340
  "path": "skills/analyze-stats/references/table-standards/table-types/incremental_value.md",
341
- "size": 4488,
342
- "sha256": "7a79208ff425c306e877b0938dbe8e1c8f6e663d32f5509496ef1ff87ff18b04"
341
+ "size": 8288,
342
+ "sha256": "8cd2c321a7e902e730ad77f30e45be95e489bd9344171e176c558009f8bec153"
343
343
  },
344
344
  {
345
345
  "path": "skills/analyze-stats/references/table-standards/table-types/meta_analysis.md",
@@ -1083,8 +1083,8 @@
1083
1083
  },
1084
1084
  {
1085
1085
  "path": "skills/deidentify/deidentify.py",
1086
- "size": 46012,
1087
- "sha256": "9aa00c186b7bf9d9130be5a79af8645004be40ab12ec3ae9171a632da67b4cb9"
1086
+ "size": 46778,
1087
+ "sha256": "5931af2083887f202842f7e1a9df79a501436c004f749ce1e8d833d7d814601a"
1088
1088
  },
1089
1089
  {
1090
1090
  "path": "skills/deidentify/locales/_template.json",
@@ -1456,6 +1456,11 @@
1456
1456
  "size": 1829,
1457
1457
  "sha256": "2d6a19ecd70d20211a31ab0be294793dea4b0ec1c0410f6e2147cb2022c7a3a6"
1458
1458
  },
1459
+ {
1460
+ "path": "skills/find-journal/references/journal_profiles/Annals_of_Oncology.md",
1461
+ "size": 3586,
1462
+ "sha256": "33a169e9458616cf3261019e3ffe8cd699901ab8fa2706cc4298b035b5edffe3"
1463
+ },
1459
1464
  {
1460
1465
  "path": "skills/find-journal/references/journal_profiles/Artificial_Intelligence_in_Medicine.md",
1461
1466
  "size": 1554,
@@ -1463,8 +1468,8 @@
1463
1468
  },
1464
1469
  {
1465
1470
  "path": "skills/find-journal/references/journal_profiles/BJR_Case_Reports.md",
1466
- "size": 2044,
1467
- "sha256": "74eac3cbdacfc9fddbcb6b6070e2be91b37a8042f9e2e4f34a4c2eb25a3041bf"
1471
+ "size": 2041,
1472
+ "sha256": "579704a717ee7e79cd9c2ca2b1c55ac25af33b9a10cd87442f72026b073885d3"
1468
1473
  },
1469
1474
  {
1470
1475
  "path": "skills/find-journal/references/journal_profiles/BMC_Medicine.md",
@@ -1473,8 +1478,8 @@
1473
1478
  },
1474
1479
  {
1475
1480
  "path": "skills/find-journal/references/journal_profiles/BMJ_Case_Reports.md",
1476
- "size": 2145,
1477
- "sha256": "029e4d1a1860f6d93345278726c0195d1c0a7ceaed1fe7510441c89efd953f7d"
1481
+ "size": 2142,
1482
+ "sha256": "7662c66eb32bc6c40815d64ae08f923ab6ba8506725988bdb5db95a1f3a13601"
1478
1483
  },
1479
1484
  {
1480
1485
  "path": "skills/find-journal/references/journal_profiles/British_Journal_of_Radiology.md",
@@ -1483,13 +1488,23 @@
1483
1488
  },
1484
1489
  {
1485
1490
  "path": "skills/find-journal/references/journal_profiles/CVIR.md",
1486
- "size": 2881,
1487
- "sha256": "a28b761930d158def0153408ea8d152c1a27d7122c2043178509405090efad1f"
1491
+ "size": 2878,
1492
+ "sha256": "78016adb4143aca41e8861751896bf780da66f61fceb6303ab06996190abe83e"
1493
+ },
1494
+ {
1495
+ "path": "skills/find-journal/references/journal_profiles/Cancer_Research_and_Treatment.md",
1496
+ "size": 4032,
1497
+ "sha256": "db49c78c140d5d6a49d6fecd013365ee0a72b43ed97a551b4fd9be0e2a41f51d"
1488
1498
  },
1489
1499
  {
1490
1500
  "path": "skills/find-journal/references/journal_profiles/Chest.md",
1491
- "size": 3386,
1492
- "sha256": "99f7780968ba1457dda311c48e6613b34d752f0165665094fc516a8258d06801"
1501
+ "size": 3383,
1502
+ "sha256": "4a6f33f8167caa195f885d76ef299dd1a9be00fda979ffd8c3595bbd88c17a62"
1503
+ },
1504
+ {
1505
+ "path": "skills/find-journal/references/journal_profiles/Clinical_Cancer_Research.md",
1506
+ "size": 4381,
1507
+ "sha256": "44123275b0643186a63ed0bd5e184676da5f5d8d53e7fba27f791f9d885b5560"
1493
1508
  },
1494
1509
  {
1495
1510
  "path": "skills/find-journal/references/journal_profiles/Clinical_Radiology.md",
@@ -1503,8 +1518,8 @@
1503
1518
  },
1504
1519
  {
1505
1520
  "path": "skills/find-journal/references/journal_profiles/Cureus.md",
1506
- "size": 1836,
1507
- "sha256": "daafc2d6ec1e2058a9d6ae037c9ed29fc5ef200695a52016f846e80ced91ab2f"
1521
+ "size": 1833,
1522
+ "sha256": "d7c20f59e305d6626fd0a79fad94e67837aeff14c968a487afb75e8325efe01e"
1508
1523
  },
1509
1524
  {
1510
1525
  "path": "skills/find-journal/references/journal_profiles/Diabetes_Metabolism_Journal.md",
@@ -1516,6 +1531,11 @@
1516
1531
  "size": 2210,
1517
1532
  "sha256": "ea2ba5ab54862bea842c799614c3ed16617d50ff40178d3d721fbd6af6541aef"
1518
1533
  },
1534
+ {
1535
+ "path": "skills/find-journal/references/journal_profiles/ESMO_Open.md",
1536
+ "size": 4030,
1537
+ "sha256": "ff8ed0deb9dcb405fad3de565f964e3fccbf3e1fc68dda22812e1edd6c7e0291"
1538
+ },
1519
1539
  {
1520
1540
  "path": "skills/find-journal/references/journal_profiles/Endocrinology_and_Metabolism.md",
1521
1541
  "size": 2672,
@@ -1626,11 +1646,21 @@
1626
1646
  "size": 1759,
1627
1647
  "sha256": "b0a2a7aa791e86b375ba19e63036106ab712cb14f4c9ca0398de75dc19e3f946"
1628
1648
  },
1649
+ {
1650
+ "path": "skills/find-journal/references/journal_profiles/Journal_of_Breast_Cancer.md",
1651
+ "size": 3517,
1652
+ "sha256": "66d2fd34f44ca75e83008543886532c7dea2a8c89137d7851b7780f048cab52b"
1653
+ },
1629
1654
  {
1630
1655
  "path": "skills/find-journal/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md",
1631
1656
  "size": 2837,
1632
1657
  "sha256": "8c40a36ec7409b86d4e222a71b4bb39deb453d038ca83da1d7761ade2517657f"
1633
1658
  },
1659
+ {
1660
+ "path": "skills/find-journal/references/journal_profiles/Journal_of_Clinical_Oncology.md",
1661
+ "size": 4268,
1662
+ "sha256": "ce289ff9a5b5ed1317855431ecb08d5cfb103e05c5b0825924a36c7b78568d86"
1663
+ },
1634
1664
  {
1635
1665
  "path": "skills/find-journal/references/journal_profiles/Journal_of_Magnetic_Resonance_Imaging.md",
1636
1666
  "size": 1576,
@@ -1638,8 +1668,8 @@
1638
1668
  },
1639
1669
  {
1640
1670
  "path": "skills/find-journal/references/journal_profiles/Journal_of_Medical_Case_Reports.md",
1641
- "size": 1954,
1642
- "sha256": "60faecafdc259db288cf91fb1430eeb619f47e73886c1dad483c05ae9d54f22d"
1671
+ "size": 1951,
1672
+ "sha256": "149ccfb0c2dfc482169c5897c9e5cab6a44f7f71e827cf1be169db6ba3486dee"
1643
1673
  },
1644
1674
  {
1645
1675
  "path": "skills/find-journal/references/journal_profiles/Journal_of_Nuclear_Medicine.md",
@@ -1768,8 +1798,8 @@
1768
1798
  },
1769
1799
  {
1770
1800
  "path": "skills/find-journal/references/journal_profiles/Radiology_Case_Reports.md",
1771
- "size": 1849,
1772
- "sha256": "87067ec91a2d6c2d3d4e8dd00f41e0ca065926f4db36f0a20f273b6f0d2c2925"
1801
+ "size": 1846,
1802
+ "sha256": "4fd5ec1cc30c9d87b9c539bddf3c73ea455e8255069e92c00ec07559d94b157b"
1773
1803
  },
1774
1804
  {
1775
1805
  "path": "skills/find-journal/references/journal_profiles/Skeletal_Radiology.md",
@@ -1793,14 +1823,19 @@
1793
1823
  },
1794
1824
  {
1795
1825
  "path": "skills/find-journal/references/journal_profiles/The_Lancet_Digital_Health.md",
1796
- "size": 2234,
1797
- "sha256": "35bb895cadb1867b081184cc7b044f7c95dc7b6c9289a3ce2d311e9eec811214"
1826
+ "size": 2231,
1827
+ "sha256": "bb3ac6c10aa733cb4fbeb823ed5288001fa5a72e8aa0e47cd87b9f80a0b0310d"
1798
1828
  },
1799
1829
  {
1800
1830
  "path": "skills/find-journal/references/journal_profiles/World_Journal_of_Hepatology.md",
1801
1831
  "size": 3707,
1802
1832
  "sha256": "912a14910717f00306a8f94a7b1ec4cd81a2690dae0dcabe1a85d7e82e109eb2"
1803
1833
  },
1834
+ {
1835
+ "path": "skills/find-journal/references/journal_profiles/npj_Breast_Cancer.md",
1836
+ "size": 4589,
1837
+ "sha256": "af2714dd8f07b12bfa9b54bdd1c711781271c0727ace6cee87ce763d553908e8"
1838
+ },
1804
1839
  {
1805
1840
  "path": "skills/find-journal/references/journal_profiles/npj_Digital_Medicine.md",
1806
1841
  "size": 1511,
@@ -2198,8 +2233,8 @@
2198
2233
  },
2199
2234
  {
2200
2235
  "path": "skills/make-figures/references/exemplar_plots/README.md",
2201
- "size": 10492,
2202
- "sha256": "8840d2b36492f10afc4f17340903c8c052fa78f0966a3379d401996830c41f70"
2236
+ "size": 11082,
2237
+ "sha256": "55d62362fa4d5a3a08899d869739a2d81ceae9c53a1f42ef84d463caf5f70be6"
2203
2238
  },
2204
2239
  {
2205
2240
  "path": "skills/make-figures/references/exemplar_plots/ai_assistance_effect.md",
@@ -2281,6 +2316,11 @@
2281
2316
  "size": 4581,
2282
2317
  "sha256": "9bedf2f0b762702b1b9f794d6e83abc512a0bd504101ac27133558074a788b04"
2283
2318
  },
2319
+ {
2320
+ "path": "skills/make-figures/references/exemplar_plots/shap_beeswarm.md",
2321
+ "size": 4850,
2322
+ "sha256": "bc3de2226c96d4d935d5291b4058e0cdd1dc03e807004391347b3ba32a6311d5"
2323
+ },
2284
2324
  {
2285
2325
  "path": "skills/make-figures/references/exemplar_plots/spider_plot.md",
2286
2326
  "size": 3114,
@@ -6131,6 +6171,11 @@
6131
6171
  "size": 6387,
6132
6172
  "sha256": "58e6ee1186985e75054194070a8e97e871fe6207bfaab07264d8ea1e5cc330eb"
6133
6173
  },
6174
+ {
6175
+ "path": "skills/write-paper/references/journal_profiles/Annals_of_Oncology.md",
6176
+ "size": 7859,
6177
+ "sha256": "5352cfac5c6a396c78fc506224371b5ee6fc69bdd26694d261ef299cf1dfab09"
6178
+ },
6134
6179
  {
6135
6180
  "path": "skills/write-paper/references/journal_profiles/Artificial_Intelligence_in_Medicine.md",
6136
6181
  "size": 3492,
@@ -6146,10 +6191,20 @@
6146
6191
  "size": 7825,
6147
6192
  "sha256": "db438eb8e86a2f6f6da37c9495eaf65d45bb6139f42b409a3c3a16ca1da78ea8"
6148
6193
  },
6194
+ {
6195
+ "path": "skills/write-paper/references/journal_profiles/Cancer_Research_and_Treatment.md",
6196
+ "size": 7484,
6197
+ "sha256": "c1549dec158b9e00a3032c4da78a61ad3a0919f736e2f7d24d07af0afc02e94b"
6198
+ },
6149
6199
  {
6150
6200
  "path": "skills/write-paper/references/journal_profiles/Chest.md",
6151
- "size": 16319,
6152
- "sha256": "092cd7c888e1075abc13b59941de604b21201addf27301751db1b28ba975cd21"
6201
+ "size": 16316,
6202
+ "sha256": "24f7de1e22a61aee85b22c0b34cbf13a237ca04065a14512102c83b9ed584808"
6203
+ },
6204
+ {
6205
+ "path": "skills/write-paper/references/journal_profiles/Clinical_Cancer_Research.md",
6206
+ "size": 10002,
6207
+ "sha256": "d45c8aa63feb2ad197a19bffdcef477f7ac801c374a7a30c13591c2ffff7d2c4"
6153
6208
  },
6154
6209
  {
6155
6210
  "path": "skills/write-paper/references/journal_profiles/Clinical_Radiology.md",
@@ -6171,6 +6226,11 @@
6171
6226
  "size": 12383,
6172
6227
  "sha256": "3ebcba0749b4a70c4f7b0d2dc1ec09cc28b982f942d879db9719808315829c0e"
6173
6228
  },
6229
+ {
6230
+ "path": "skills/write-paper/references/journal_profiles/ESMO_Open.md",
6231
+ "size": 8040,
6232
+ "sha256": "2c4d46e246d4a8f2cc1bff1a7d3a4c422ad66da1bdb46e01ef08828dd93e20e6"
6233
+ },
6174
6234
  {
6175
6235
  "path": "skills/write-paper/references/journal_profiles/Endocrinology_and_Metabolism.md",
6176
6236
  "size": 7164,
@@ -6263,23 +6323,33 @@
6263
6323
  },
6264
6324
  {
6265
6325
  "path": "skills/write-paper/references/journal_profiles/JNIS.md",
6266
- "size": 10421,
6267
- "sha256": "6314ce1c3c57810d9a48dd9eb277d473f402cad063ba1c1d67ca811ee9d75e09"
6326
+ "size": 10418,
6327
+ "sha256": "0ba37375a08032323ee15dae79c878957e2099b50b8ebf26d7caa4e1e9e50df4"
6268
6328
  },
6269
6329
  {
6270
6330
  "path": "skills/write-paper/references/journal_profiles/JVIR.md",
6271
6331
  "size": 6124,
6272
6332
  "sha256": "313604759c6e6471ec82e55ab0db489058fe2a7a2628f4fae92471423fb64f60"
6273
6333
  },
6334
+ {
6335
+ "path": "skills/write-paper/references/journal_profiles/Journal_of_Breast_Cancer.md",
6336
+ "size": 7277,
6337
+ "sha256": "0dc4bede6e74c540ce5b8326db5d49b245f76867e5951703abc2ad07c0c515af"
6338
+ },
6274
6339
  {
6275
6340
  "path": "skills/write-paper/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md",
6276
6341
  "size": 9600,
6277
6342
  "sha256": "2cade69fc364915be5ff06cee7a6b77b9bde0c5499fac75f05007332affca8d8"
6278
6343
  },
6344
+ {
6345
+ "path": "skills/write-paper/references/journal_profiles/Journal_of_Clinical_Oncology.md",
6346
+ "size": 9172,
6347
+ "sha256": "582dc60183235ed628c0c4483bcc803e337ea62e8fdd5856ccfc2cd1277dbc41"
6348
+ },
6279
6349
  {
6280
6350
  "path": "skills/write-paper/references/journal_profiles/Journal_of_Stroke.md",
6281
- "size": 7740,
6282
- "sha256": "e551e78c799c6a26754f3186ee6d7ce0dd6931e5dc352dc225ee30e94cf1dca7"
6351
+ "size": 7737,
6352
+ "sha256": "079a49839844824645be89c0d5abbccace3ddb765f925f2bee0ec43cc8c806c3"
6283
6353
  },
6284
6354
  {
6285
6355
  "path": "skills/write-paper/references/journal_profiles/KJR.md",
@@ -6308,8 +6378,8 @@
6308
6378
  },
6309
6379
  {
6310
6380
  "path": "skills/write-paper/references/journal_profiles/Liver_International.md",
6311
- "size": 12373,
6312
- "sha256": "f6ff23ae9ca9b7d6cbc6d3250a6098c45c4e1c9c36f263a77647acac9a2bcadd"
6381
+ "size": 12370,
6382
+ "sha256": "e0d280ab2302a09f03a4be6fea6c4518f48ee1c0b9558cf8158006223a6e6fa2"
6313
6383
  },
6314
6384
  {
6315
6385
  "path": "skills/write-paper/references/journal_profiles/Medical_Image_Analysis.md",
@@ -6323,8 +6393,8 @@
6323
6393
  },
6324
6394
  {
6325
6395
  "path": "skills/write-paper/references/journal_profiles/NEJM_AI.md",
6326
- "size": 9486,
6327
- "sha256": "6155b1377e626d42b59b957d1752a0ff226731e5d57dee14e7ab1a1ed346665b"
6396
+ "size": 9483,
6397
+ "sha256": "2c3880cd309eaacbda6b1a82e85bb4efea4735b03e8fe4b2feb27a4e817d2b8e"
6328
6398
  },
6329
6399
  {
6330
6400
  "path": "skills/write-paper/references/journal_profiles/Nature_Medicine.md",
@@ -6363,8 +6433,8 @@
6363
6433
  },
6364
6434
  {
6365
6435
  "path": "skills/write-paper/references/journal_profiles/Stroke.md",
6366
- "size": 8786,
6367
- "sha256": "c4294b7b897932c9b3a9c700da39fb770814acdda3b2b9471ca81f1b773b5022"
6436
+ "size": 8780,
6437
+ "sha256": "6c7ab7b6fd0ee1c18f905333bd42770f6e8b430eab7edb692a7b3cf9ba775df4"
6368
6438
  },
6369
6439
  {
6370
6440
  "path": "skills/write-paper/references/journal_profiles/The_BMJ.md",
@@ -6378,14 +6448,19 @@
6378
6448
  },
6379
6449
  {
6380
6450
  "path": "skills/write-paper/references/journal_profiles/The_Lancet_Digital_Health.md",
6381
- "size": 8947,
6382
- "sha256": "5651fca14c1b2d78cb0b535d431487a6904f0e18c354dab52e192cccb8dc9014"
6451
+ "size": 8944,
6452
+ "sha256": "723b0f5e91be86298401ea2f1b6e76675881675de1a7622dde8de906f0033a2f"
6383
6453
  },
6384
6454
  {
6385
6455
  "path": "skills/write-paper/references/journal_profiles/World_Journal_of_Hepatology.md",
6386
6456
  "size": 7289,
6387
6457
  "sha256": "4f8594e07080dafb56dc6945addf45e7ceddbc3185f781f4edcd211744a8fb24"
6388
6458
  },
6459
+ {
6460
+ "path": "skills/write-paper/references/journal_profiles/npj_Breast_Cancer.md",
6461
+ "size": 10165,
6462
+ "sha256": "84eced761fe6094146bde8f09f812b1df28c464997c07c36c641c076a170f832"
6463
+ },
6389
6464
  {
6390
6465
  "path": "skills/write-paper/references/journal_profiles/npj_Digital_Medicine.md",
6391
6466
  "size": 6000,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": 1,
3
- "version": "5.27.0",
3
+ "version": "5.28.0",
4
4
  "owned_skills": [
5
5
  "academic-aio",
6
6
  "add-journal",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medsci-skills",
3
- "version": "5.27.0",
3
+ "version": "5.28.0",
4
4
  "description": "MedSci Skills — a medical/scientific research skill suite for AI coding agents (Claude Code, Codex, Cursor, Copilot). The npm package is a terminal-friendly installer shortcut; the canonical distribution remains the GitHub repository and the Claude Code plugin marketplace.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://github.com/Aperivue/medsci-skills#readme",
@@ -415,16 +415,16 @@ tbl %>% as_flex_table() %>% flextable::save_as_docx(path = "table.docx")
415
415
  - Always report: sensitivity, specificity, PPV, NPV, accuracy, AUC
416
416
  - CIs: Wilson score for proportions, DeLong for AUC
417
417
  - ROC curve: include diagonal reference line, AUC in legend
418
- - If comparing models: DeLong test for AUC comparison
418
+ - If comparing models: paired DeLong test for two separate scores on the same patients. For a nested "baseline + new term" model fitted and evaluated on the same data, do not use it as the added-value test; test the term (likelihood ratio) and report ΔAUC with its CI (see the table guide below)
419
419
  - Youden's index for optimal threshold when applicable
420
420
  - Include calibration assessment (Brier score, calibration plot) for prediction models
421
- - **NRI/IDI**: When comparing two models (e.g., base model vs model + AI score), report:
422
- - Category-based NRI (with clinically defined risk categories)
423
- - Continuous NRI (note: tends to be inflated — report alongside category-based)
421
+ - **NRI/IDI**: If reported when comparing two models (e.g., base model vs model + AI score):
422
+ - NRI separately for events and non-events (with two risk categories these are the changes in sensitivity and specificity)
423
+ - Categorical NRI only with prespecified, clinically defined risk categories; never the continuous (category-free) NRI as evidence of added value — it can overstate it even in validation data
424
424
  - IDI (Integrated Discrimination Improvement)
425
425
  - Bootstrap 95% CIs (1000+ iterations)
426
- - These supplement, not replace, DeLong AUC comparison
427
- - Table type guide (added value beyond a baseline): `references/table-standards/table-types/incremental_value.md` (paired ΔAUC + DeLong CI, continuous NRI with event/non-event split, IDI, net benefit at a prespecified threshold, same-patient/calibrated-first discipline). Pairs the decision-curve exemplar `make-figures` `references/exemplar_plots/decision_curve.md`.
426
+ - These supplement the added-value test and ΔAUC with its CI; net benefit is the preferred single summary
427
+ - Table type guide (added value beyond a baseline): `references/table-standards/table-types/incremental_value.md` (likelihood-ratio test of the new term, paired ΔAUC with CI as an estimate, NRI split by events/non-events, IDI, net benefit at a prespecified threshold, same-patient/calibrated-first discipline). Pairs the decision-curve exemplar `make-figures` `references/exemplar_plots/decision_curve.md`.
428
428
  - Reader study (MRMC): `references/table-standards/table-types/reader_study.md` (per-reader + reader-averaged AUC with an Obuchowski–Rockette/DBM reader+case CI, per-patient vs per-lesion unit, superiority vs non-inferiority margin). Use an MRMC method (not a fixed-reader DeLong CI) for a claim that generalises to readers. Pairs `make-figures` `references/exemplar_plots/mrmc_roc.md`.
429
429
 
430
430
  ### Inter-rater Agreement
@@ -3,8 +3,9 @@
3
3
  The table standard for any "the new marker/model adds value **beyond** an established baseline"
4
4
  claim — a new biomarker on top of a clinical score, an AI model on top of a radiologist or a
5
5
  guideline nomogram. Discrimination alone (a higher AUROC) is not sufficient evidence of added
6
- value; report the paired change in discrimination **with** a reclassification and a clinical-utility
7
- metric, all on the **same patients** and the same held-out data.
6
+ value; report the paired change in discrimination **with** a clinical-utility metric (and
7
+ reclassification, if used, reported as below), all on the **same patients** and the same held-out
8
+ data.
8
9
 
9
10
  ## Reporting Guidelines
10
11
  - **TRIPOD / TRIPOD+AI**: prediction-model development/validation, model comparison and performance
@@ -17,13 +18,15 @@ metric, all on the **same patients** and the same held-out data.
17
18
  ```
18
19
  Table 4. Incremental Value of [New Predictor/Model] Added to [Baseline] (external test set, n = ___, events = ___)
19
20
 
20
- Model C-statistic (95% CI) ΔC (95% CI) P (ΔC) Continuous NRI (95% CI) IDI (95% CI) ΔNet benefit @ threshold
21
- Baseline ([predictors]) 0.74 (0.70-0.78) — (reference) — — — — (reference)
22
- Baseline + [new predictor] 0.81 (0.77-0.85) 0.07 (0.04-0.10) <.001 0.38 (0.21-0.55) 0.045 (0.02-0.07) +0.021 @ 10%
21
+ Model C-statistic (95% CI) ΔC (95% CI) NRI events / non-events (95% CI) IDI (95% CI) ΔNet benefit @ threshold (95% CI)
22
+ Baseline ([predictors]) 0.74 (0.70-0.78) — (reference) — — — (reference)
23
+ Baseline + [new predictor] 0.81 (0.77-0.85) 0.07 (0.04-0.10) ___ / ___ 0.045 (0.02-0.07) +0.021 (___-___) @ 10%
23
24
 
24
- ΔC by DeLong test on paired, same-patient predictions. NRI/IDI from the paired risk
25
- estimates (event/non-event components reported separately in the footnote). Net benefit
26
- from decision-curve analysis at the prespecified threshold; full curve in Figure X.
25
+ Added-value test: likelihood-ratio test of [new predictor] in the development cohort
26
+ (n = ___, events = ___), χ²(df) = ___, P = ___. ΔC is the size of the gain on these held-out
27
+ patients with a paired 95% CI (DeLong or bootstrap) — an estimate, not a second test. NRI/IDI
28
+ from the paired risk estimates, NRI given separately for events and non-events. Net benefit from
29
+ decision-curve analysis at the prespecified threshold; full curve in Figure X.
27
30
  ```
28
31
 
29
32
  ## Rules
@@ -31,41 +34,82 @@ from decision-curve analysis at the prespecified threshold; full curve in Figure
31
34
  term, evaluated on the **identical** held-out patients — not two models on different cohorts.
32
35
  - **Baseline named and justified**: state exactly what the baseline contains (clinical score,
33
36
  guideline nomogram, prior model) and that it was applied as published / recalibrated / refit.
34
- - **ΔAUC with a paired CI and test**: report ΔC-statistic with a 95% CI and the **DeLong** paired
35
- test, not two independent AUROCs eyeballed side by side. A tiny, non-significant ΔC with wide CI
36
- is not "added value."
37
- - **Reclassification reported correctly**: prefer **continuous NRI** or category-free NRI; if a
38
- categorical NRI is used, prespecify and justify the risk categories (post-hoc categories inflate
39
- NRI). Always report **event** and **non-event** NRI components separately — a positive overall
40
- NRI driven only by the non-event component is weak. Report **IDI** alongside.
37
+ - **One test for "adds anything", then an estimate for "how much"**: for a prespecified term added
38
+ to a regression baseline, whether it adds information is tested through its coefficient in the
39
+ full model. That is the **likelihood-ratio** (or Wald) test in the development data, with both
40
+ models fitted on the same observations. ΔC-statistic is then reported as the **size** of the
41
+ gain, with a paired 95% CI, not as a second significance test. A DeLong test of ΔAUC between
42
+ nested models **fitted and evaluated on the same data** is the wrong test for added value. When
43
+ the new term has no association, the statistic's null distribution is not normal, and the test
44
+ is conservative for small and moderate effects (Demler, Pencina & D'Agostino, *Stat Med* 2012).
45
+ In simulation its size fell below 0.006, with much lower power than the likelihood-ratio and
46
+ Wald tests (Vickers, Cronin & Begg, *BMC Med Res Methodol* 2011). A marker with a modest real
47
+ association can therefore "fail" it. On held-out data, comparing two models **frozen before
48
+ evaluation** is what the DeLong method was built for: correlated ROC curves of given scores on
49
+ the same patients. In simulation it held its nominal type I error there (Chen et al., *BMC Med
50
+ Res Methodol* 2013). It then answers whether those two scores differ in AUC, not whether the
51
+ new term carries information. When the augmented model is not a regression with a separable
52
+ prespecified term, such as a retrained network or a data-selected predictor set, that held-out
53
+ paired comparison is the evidence, not a coefficient test. Never compare two independent AUROCs
54
+ by eye, side by side. A tiny ΔC with a wide CI is not evidence of added discrimination, though on
55
+ its own it does not rule out a gain in calibration or net benefit.
56
+ - **Reclassification, if reported, reported correctly**: give NRI **separately for events and
57
+ non-events**. An overall NRI can be positive from one side alone, and which side moved decides
58
+ whether the change matters clinically: more events caught, or fewer non-events flagged. With two
59
+ risk categories those components are simply the changes in sensitivity and specificity, so report
60
+ them under those names. **Do not present the category-free (continuous) NRI as evidence of added
61
+ value**: it can overstate a marker's incremental value even in independent validation data. With
62
+ three or more categories the same review recommends against NRI altogether (Kerr et al.,
63
+ *Epidemiology* 2014). If a categorical NRI is used anyway, prespecify and justify the categories
64
+ (post-hoc categories inflate NRI), and bootstrap its CI rather than using published variance
65
+ formulas. IDI, if reported, goes alongside with its CI.
41
66
  - **Clinical utility, not just statistics**: include **net benefit** (decision-curve analysis) at a
42
67
  prespecified, clinically justified threshold (and reference the full curve —
43
- `make-figures` `exemplar_plots/decision_curve.md`). Reclassification metrics without utility can
44
- mislead.
45
- - **Calibration first**: NRI/IDI/net benefit all depend on predicted probabilities, so both models
46
- must be calibrated on the test data before these are computed (pair with the calibration plot).
68
+ `make-figures` `exemplar_plots/decision_curve.md`). The improvement in net benefit is the
69
+ preferred single-number summary of the increment (Kerr et al. 2014). Reclassification metrics
70
+ without utility can mislead.
71
+ - **Calibration first**: NRI/IDI/net benefit all depend on predicted probabilities, so assess both
72
+ models' calibration on the test data before computing them (pair with the calibration plot). If
73
+ a model has to be recalibrated, do it on data other than the test set. Recalibrating on the test
74
+ outcomes and then evaluating on them is no longer a validation of a frozen model.
47
75
  - **One decimal discipline / CIs everywhere**: every estimate carries a 95% CI; bootstrap CIs state
48
76
  the number of replicates; the same bootstrap resamples are reused across paired metrics.
49
77
 
50
78
  ## Common pitfalls (flag in review)
51
- - Reporting only ΔAUROC and calling it "added value" (no reclassification, no utility).
79
+ - Reporting only ΔAUROC and calling it "added value" (no clinical-utility metric).
52
80
  - NRI with post-hoc categories, or only the overall NRI without event/non-event split.
81
+ - A DeLong test of ΔAUC used as the significance test for an added predictor in nested models
82
+ fitted and evaluated on the same data. It is conservative and underpowered there, so test the
83
+ coefficient.
84
+ - A continuous (category-free) NRI offered as the evidence of added value.
53
85
  - New vs baseline AUROCs from different cohorts or different n (not a paired comparison).
54
86
  - Net benefit asserted in prose with no decision curve and no stated threshold.
55
87
 
56
88
  ## Code (illustrative)
57
89
 
58
90
  ```r
59
- # Paired ΔAUC with DeLong CI (pROC); NRI/IDI (Hmisc / nricens / PredictABEL-style).
91
+ # 1) Does the new term add anything? One test: likelihood ratio, in the development data.
92
+ # Fit both models on the same complete cases, or the comparison is not nested.
93
+ dev <- dev[complete.cases(dev[, c("y", "x1", "x2", "marker")]), ]
94
+ fit_base <- glm(y ~ x1 + x2, family = binomial, data = dev)
95
+ fit_full <- glm(y ~ x1 + x2 + marker, family = binomial, data = dev)
96
+ anova(fit_base, fit_full, test = "LRT") # Cox: anova(cox_base, cox_full)
97
+ # 2) How much? Paired ΔAUC with its CI on the held-out patients -- an estimate, not a 2nd test.
98
+ # Fix the outcome levels and direction so roc() cannot flip a score on the test data.
60
99
  library(pROC)
61
- roc_base <- roc(y, p_baseline); roc_full <- roc(y, p_full)
62
- roc.test(roc_base, roc_full, method = "delong", paired = TRUE) # ΔC + p, paired
63
- # NRI/IDI from paired risk vectors p_baseline, p_full (report event + non-event components);
100
+ roc_base <- roc(y_test, p_baseline, levels = c(0, 1), direction = "<")
101
+ roc_full <- roc(y_test, p_full, levels = c(0, 1), direction = "<")
102
+ roc.test(roc_full, roc_base, method = "delong", paired = TRUE)$conf.int # CI of full - base
103
+ # NRI (events / non-events separately) and IDI from the paired risk vectors p_baseline, p_full;
64
104
  # net benefit via the decision-curve template (analyze-stats references/templates/dca_plot.R).
65
105
  ```
66
106
 
67
107
  ```python
68
- # Paired DeLong CI for ΔAUC (e.g., delong_roc_test); reclassification via statsmodels/lifelines-
69
- # adjacent helpers. Compute NRI/IDI on the SAME held-out patients used for the AUCs; reuse one set
70
- # of bootstrap resamples across ΔAUC, NRI, IDI, and net benefit so the CIs are mutually consistent.
108
+ # 1) One test for "adds anything": likelihood ratio of the nested fits (development data),
109
+ # both fitted on the same observations.
110
+ from scipy.stats import chi2
111
+ lr = 2 * (fit_full.llf - fit_base.llf) # statsmodels Logit / GLM results
112
+ p = chi2.sf(lr, fit_full.df_model - fit_base.df_model)
113
+ # 2) ΔAUC on the SAME held-out patients with a paired bootstrap CI (an estimate, not a 2nd test);
114
+ # reuse one set of resamples across ΔAUC, NRI, IDI and net benefit so the CIs are consistent.
71
115
  ```
@@ -163,11 +163,14 @@ def build_locale_patterns(locale: dict) -> tuple[
163
163
  # Value patterns: universal + locale-specific
164
164
  value_patterns = list(UNIVERSAL_VALUE_PATTERNS)
165
165
 
166
- # National ID
166
+ # National ID. Compiled case-insensitively: locale packs write letter
167
+ # classes in upper case (UK NINO, Indian PAN), but IDs are often exported
168
+ # in lower case, and a missed match classifies the column SAFE, so it is
169
+ # passed through un-stripped. A miss here is a leak, not a lost warning.
167
170
  nid = locale.get("national_id", {})
168
171
  nid_type = nid.get("phi_type", "national_id")
169
172
  for pat in nid.get("patterns", []):
170
- value_patterns.append((re.compile(pat), nid_type))
173
+ value_patterns.append((re.compile(pat, re.IGNORECASE), nid_type))
171
174
 
172
175
  # Phone
173
176
  for phone in locale.get("phone", []):
@@ -186,9 +189,11 @@ def build_locale_patterns(locale: dict) -> tuple[
186
189
  # Build a regex from keywords (case-insensitive word boundary match)
187
190
  escaped = [re.escape(kw) for kw in addr_cfg["keywords"]]
188
191
  address_re = re.compile(r"(?:" + "|".join(escaped) + r")", re.IGNORECASE)
189
- # Postcode pattern (if available, add to value_patterns as address type)
192
+ # Postcode pattern (if available, add to value_patterns as address type).
193
+ # Case-insensitive for the same reason as national IDs above.
190
194
  if addr_cfg.get("postcode_pattern"):
191
- value_patterns.append((re.compile(addr_cfg["postcode_pattern"]), "address"))
195
+ value_patterns.append(
196
+ (re.compile(addr_cfg["postcode_pattern"], re.IGNORECASE), "address"))
192
197
 
193
198
  # Name heuristic
194
199
  name_cfg = locale.get("name_heuristic", {})
@@ -382,12 +387,17 @@ def scan_column_names(headers: list[str],
382
387
  return results
383
388
 
384
389
 
385
- def _sample_values(values: list[str], n: int = 500) -> list[str]:
386
- """Return up to n non-empty values for scanning."""
387
- non_empty = [v for v in values if v and v.strip()]
388
- if len(non_empty) <= n:
389
- return non_empty
390
- return random.sample(non_empty, n)
390
+ def _values_to_scan(values: list[str]) -> list[str]:
391
+ """Return every non-empty value in the column.
392
+
393
+ This used to be a random sample of at most 500 values, and that caused
394
+ two defects. First, the same file could classify differently from one
395
+ run to the next. Second, a column where only a few values carry PHI
396
+ (three phone numbers in 2,000 notes) came out SAFE whenever the sample
397
+ missed them, and a SAFE column is passed through un-stripped. A SAFE
398
+ verdict asserts that no value matched, so every value has to be checked.
399
+ """
400
+ return [v for v in values if v and v.strip()]
391
401
 
392
402
 
393
403
  def scan_column_values(col: str, values: list[str],
@@ -406,7 +416,7 @@ def scan_column_values(col: str, values: list[str],
406
416
  if name_columns is None:
407
417
  name_columns = [k for k, v in UNIVERSAL_COLUMN_NAMES.items() if v == "name"]
408
418
 
409
- sample = _sample_values(values)
419
+ sample = _values_to_scan(values)
410
420
  if not sample:
411
421
  return None
412
422
 
@@ -535,7 +545,7 @@ def classify_columns(data: list[dict], headers: list[str],
535
545
  if avg_len > 50:
536
546
  # Scan for embedded PHI in free text
537
547
  embedded_phi = False
538
- for val in _sample_values(non_empty, 100):
548
+ for val in non_empty: # every value; the loop exits on the first hit
539
549
  for regex, _ in val_patterns:
540
550
  if regex.search(val):
541
551
  embedded_phi = True