medsci-skills 4.1.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/LICENSE +50 -0
- package/README.md +602 -0
- package/README_FIRST.md +27 -0
- package/bin/medsci-skills.js +159 -0
- package/installers/install-macos.command +19 -0
- package/installers/install-windows.cmd +26 -0
- package/installers/install-windows.ps1 +17 -0
- package/installers/install.py +218 -0
- package/metadata/skills_catalog.json +452 -0
- package/package.json +48 -0
- package/skills/academic-aio/SKILL.md +408 -0
- package/skills/academic-aio/references/case_studies/kjr_mllm_2025.md +82 -0
- package/skills/academic-aio/references/checklists/AIO_GENERAL.md +354 -0
- package/skills/academic-aio/references/journal_summarybox_templates.yaml +126 -0
- package/skills/academic-aio/references/oac_funding_checklist.yaml +129 -0
- package/skills/academic-aio/references/reporting_guideline_mapping.md +39 -0
- package/skills/academic-aio/references/schema_markup_templates/CodeRepository.jsonld +32 -0
- package/skills/academic-aio/references/schema_markup_templates/Dataset.jsonld +36 -0
- package/skills/academic-aio/references/schema_markup_templates/Person.jsonld +30 -0
- package/skills/academic-aio/references/schema_markup_templates/README.md +43 -0
- package/skills/academic-aio/references/schema_markup_templates/ScholarlyArticle.jsonld +55 -0
- package/skills/academic-aio/scripts/batch_metadata_audit.py +169 -0
- package/skills/academic-aio/scripts/validate_schema.py +118 -0
- package/skills/academic-aio/skill.yml +36 -0
- package/skills/academic-aio/templates/aio_audit_checklist.md.j2 +108 -0
- package/skills/add-journal/SKILL.md +482 -0
- package/skills/add-journal/skill.yml +33 -0
- package/skills/analyze-stats/SKILL.md +598 -0
- package/skills/analyze-stats/references/analysis_guides/missing_data.md +109 -0
- package/skills/analyze-stats/references/analysis_guides/nhis_icd10_mapping.md +247 -0
- package/skills/analyze-stats/references/analysis_guides/propensity_score.md +132 -0
- package/skills/analyze-stats/references/analysis_guides/regression.md +115 -0
- package/skills/analyze-stats/references/analysis_guides/repeated_measures.md +160 -0
- package/skills/analyze-stats/references/analysis_guides/survey_weighted.md +366 -0
- package/skills/analyze-stats/references/analysis_guides/test_selection.md +86 -0
- package/skills/analyze-stats/references/style/figure_style.mplstyle +69 -0
- package/skills/analyze-stats/references/style/theme_publication.R +147 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/ajr.yaml +51 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/european_radiology.yaml +55 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/jama.yaml +66 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/lancet.yaml +57 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/nejm.yaml +51 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/radiology.yaml +66 -0
- package/skills/analyze-stats/references/table-standards/table-standards.md +287 -0
- package/skills/analyze-stats/references/table-standards/table-types/diagnostic_accuracy.md +36 -0
- package/skills/analyze-stats/references/table-standards/table-types/meta_analysis.md +58 -0
- package/skills/analyze-stats/references/table-standards/table-types/model_comparison.md +36 -0
- package/skills/analyze-stats/references/table-standards/table-types/regression_results.md +50 -0
- package/skills/analyze-stats/references/table-standards/table-types/table1_demographics.md +51 -0
- package/skills/analyze-stats/references/table-standards/tool-comparison.md +79 -0
- package/skills/analyze-stats/references/templates/agreement_analysis.py +436 -0
- package/skills/analyze-stats/references/templates/dca_plot.R +237 -0
- package/skills/analyze-stats/references/templates/diagnostic_accuracy.py +401 -0
- package/skills/analyze-stats/references/templates/dta_meta_analysis.R +384 -0
- package/skills/analyze-stats/references/templates/forest_plot.py +412 -0
- package/skills/analyze-stats/references/templates/likert_summary.py +356 -0
- package/skills/analyze-stats/references/templates/meta_analysis.R +365 -0
- package/skills/analyze-stats/references/templates/propensity_score.py +478 -0
- package/skills/analyze-stats/references/templates/regression.py +425 -0
- package/skills/analyze-stats/references/templates/repeated_measures.py +434 -0
- package/skills/analyze-stats/references/templates/sample_size.R +382 -0
- package/skills/analyze-stats/references/templates/survey_weighted_analysis.py +411 -0
- package/skills/analyze-stats/references/templates/survival_analysis.py +325 -0
- package/skills/analyze-stats/references/templates/table1_demographics.py +287 -0
- package/skills/analyze-stats/scripts/check_generated_code.py +335 -0
- package/skills/analyze-stats/skill.yml +38 -0
- package/skills/analyze-stats/tests/fixtures/gen_bad.R +16 -0
- package/skills/analyze-stats/tests/fixtures/gen_bad.py +24 -0
- package/skills/analyze-stats/tests/fixtures/gen_clean.py +21 -0
- package/skills/analyze-stats/tests/test_generated_code.sh +59 -0
- package/skills/analyze-stats/tests/test_survival_template.sh +53 -0
- package/skills/author-strategy/SKILL.md +117 -0
- package/skills/author-strategy/analyze_patterns.py +303 -0
- package/skills/author-strategy/fetch_pubmed.py +374 -0
- package/skills/author-strategy/skill.yml +34 -0
- package/skills/batch-cohort/SKILL.md +223 -0
- package/skills/batch-cohort/references/base_template_knhanes.R +210 -0
- package/skills/batch-cohort/references/batch_template_generator.R +222 -0
- package/skills/batch-cohort/references/variable_coding_registry.md +136 -0
- package/skills/batch-cohort/skill.yml +35 -0
- package/skills/calc-sample-size/SKILL.md +491 -0
- package/skills/calc-sample-size/references/formulas.md +655 -0
- package/skills/calc-sample-size/references/observational_cohort.md +49 -0
- package/skills/calc-sample-size/skill.yml +51 -0
- package/skills/check-reporting/SKILL.md +534 -0
- package/skills/check-reporting/references/LICENSES.md +41 -0
- package/skills/check-reporting/references/checklists/AMSTAR2.md +54 -0
- package/skills/check-reporting/references/checklists/ARRIVE_2.md +234 -0
- package/skills/check-reporting/references/checklists/CARE.md +102 -0
- package/skills/check-reporting/references/checklists/CLAIM_2024.md +128 -0
- package/skills/check-reporting/references/checklists/CLEAR.md +113 -0
- package/skills/check-reporting/references/checklists/CONSORT.md +86 -0
- package/skills/check-reporting/references/checklists/COSMIN_RoB.md +136 -0
- package/skills/check-reporting/references/checklists/GRRAS.md +61 -0
- package/skills/check-reporting/references/checklists/MI_CLEAR_LLM.md +167 -0
- package/skills/check-reporting/references/checklists/MOOSE.md +85 -0
- package/skills/check-reporting/references/checklists/NOS.md +88 -0
- package/skills/check-reporting/references/checklists/PRISMA_2020.md +135 -0
- package/skills/check-reporting/references/checklists/PRISMA_DTA.md +36 -0
- package/skills/check-reporting/references/checklists/PRISMA_P.md +56 -0
- package/skills/check-reporting/references/checklists/PROBAST.md +75 -0
- package/skills/check-reporting/references/checklists/PROBAST_AI.md +130 -0
- package/skills/check-reporting/references/checklists/QUADAS2.md +77 -0
- package/skills/check-reporting/references/checklists/QUADAS_C.md +131 -0
- package/skills/check-reporting/references/checklists/ROBINS_E.md +179 -0
- package/skills/check-reporting/references/checklists/ROBINS_I.md +87 -0
- package/skills/check-reporting/references/checklists/ROBIS.md +114 -0
- package/skills/check-reporting/references/checklists/ROB_ME.md +126 -0
- package/skills/check-reporting/references/checklists/RoB2.md +79 -0
- package/skills/check-reporting/references/checklists/RoB_NMA.md +96 -0
- package/skills/check-reporting/references/checklists/SPIRIT.md +112 -0
- package/skills/check-reporting/references/checklists/SQUIRE_2.md +68 -0
- package/skills/check-reporting/references/checklists/STARD.md +129 -0
- package/skills/check-reporting/references/checklists/STARD_AI.md +211 -0
- package/skills/check-reporting/references/checklists/STROBE.md +80 -0
- package/skills/check-reporting/references/checklists/SWiM.md +33 -0
- package/skills/check-reporting/references/checklists/TRIPOD.md +157 -0
- package/skills/check-reporting/references/checklists/TRIPOD_AI.md +140 -0
- package/skills/check-reporting/references/step4c_registration_timing.md +93 -0
- package/skills/check-reporting/references/step4d_prisma_figure_audit.md +137 -0
- package/skills/check-reporting/scripts/check_checklist_exists.py +183 -0
- package/skills/check-reporting/scripts/check_checklist_version.py +168 -0
- package/skills/check-reporting/scripts/check_framework_naming.py +206 -0
- package/skills/check-reporting/scripts/check_prisma_figure.py +209 -0
- package/skills/check-reporting/scripts/prisma_cascade_check.py +274 -0
- package/skills/check-reporting/skill.yml +41 -0
- package/skills/check-reporting/tests/fixtures/framework_bad.md +8 -0
- package/skills/check-reporting/tests/fixtures/framework_clean.md +7 -0
- package/skills/check-reporting/tests/test_checklist_fail_fast.sh +77 -0
- package/skills/check-reporting/tests/test_checklist_version.sh +72 -0
- package/skills/check-reporting/tests/test_framework_naming.sh +45 -0
- package/skills/check-reporting/tests/test_prisma_cascade.sh +104 -0
- package/skills/clean-data/SKILL.md +180 -0
- package/skills/clean-data/references/cleaning_patterns.md +299 -0
- package/skills/clean-data/references/profiling_template.py +304 -0
- package/skills/clean-data/scripts/check_structural_zero.py +174 -0
- package/skills/clean-data/skill.yml +35 -0
- package/skills/clean-data/tests/fixtures/smoking.csv +8 -0
- package/skills/clean-data/tests/test_structural_zero.sh +49 -0
- package/skills/cross-national/SKILL.md +264 -0
- package/skills/cross-national/skill.yml +37 -0
- package/skills/define-variables/SKILL.md +146 -0
- package/skills/define-variables/references/common_definitions.md +190 -0
- package/skills/define-variables/skill.yml +34 -0
- package/skills/define-variables/templates/variable_operationalization.md +64 -0
- package/skills/deidentify/SKILL.md +203 -0
- package/skills/deidentify/deidentify.py +1224 -0
- package/skills/deidentify/locales/_template.json +45 -0
- package/skills/deidentify/locales/au.json +43 -0
- package/skills/deidentify/locales/ca.json +44 -0
- package/skills/deidentify/locales/cn.json +47 -0
- package/skills/deidentify/locales/de.json +48 -0
- package/skills/deidentify/locales/fr.json +48 -0
- package/skills/deidentify/locales/in.json +48 -0
- package/skills/deidentify/locales/jp.json +48 -0
- package/skills/deidentify/locales/kr.json +48 -0
- package/skills/deidentify/locales/uk.json +45 -0
- package/skills/deidentify/locales/us.json +43 -0
- package/skills/deidentify/references/date_shift_guide.md +82 -0
- package/skills/deidentify/references/hipaa_18_identifiers.md +48 -0
- package/skills/deidentify/references/korean_phi_patterns.md +135 -0
- package/skills/deidentify/skill.yml +43 -0
- package/skills/deidentify/tests/README.md +26 -0
- package/skills/deidentify/tests/test_clean.csv +16 -0
- package/skills/deidentify/tests/test_edge_cases.csv +11 -0
- package/skills/deidentify/tests/test_phi_korean.csv +11 -0
- package/skills/design-ai-benchmarking/SKILL.md +214 -0
- package/skills/design-ai-benchmarking/references/benchmark_export_schema.json +69 -0
- package/skills/design-ai-benchmarking/references/elicitation_rubric_template.md +37 -0
- package/skills/design-ai-benchmarking/skill.yml +38 -0
- package/skills/design-study/SKILL.md +298 -0
- package/skills/design-study/skill.yml +33 -0
- package/skills/fill-icmje-coi/SKILL.md +216 -0
- package/skills/fill-icmje-coi/scripts/fill_icmje_coi.py +140 -0
- package/skills/fill-icmje-coi/skill.yml +35 -0
- package/skills/fill-icmje-coi/templates/icmje_coi_seed_synthetic.docx +0 -0
- package/skills/fill-protocol/SKILL.md +248 -0
- package/skills/fill-protocol/examples/example_irb_template.yaml +53 -0
- package/skills/fill-protocol/references/best_practices.md +121 -0
- package/skills/fill-protocol/scripts/doc_to_docx.py +111 -0
- package/skills/fill-protocol/scripts/fill_form.py +611 -0
- package/skills/fill-protocol/scripts/inspect_template.py +61 -0
- package/skills/fill-protocol/setup.sh +162 -0
- package/skills/fill-protocol/skill.yml +37 -0
- package/skills/find-cohort-gap/SKILL.md +309 -0
- package/skills/find-cohort-gap/references/cohort_profile_template.md +93 -0
- package/skills/find-cohort-gap/references/onepager_template.md +84 -0
- package/skills/find-cohort-gap/references/pattern_scoring_rubric.md +169 -0
- package/skills/find-cohort-gap/references/saturation_query_templates.md +143 -0
- package/skills/find-cohort-gap/skill.yml +35 -0
- package/skills/find-journal/POLICY.md +87 -0
- package/skills/find-journal/SKILL.md +340 -0
- package/skills/find-journal/references/journal_profiles/AJNR.md +29 -0
- package/skills/find-journal/references/journal_profiles/AJR.md +30 -0
- package/skills/find-journal/references/journal_profiles/Abdominal_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Academic_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Annals_of_Internal_Medicine.md +33 -0
- package/skills/find-journal/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +28 -0
- package/skills/find-journal/references/journal_profiles/BMC_Medicine.md +31 -0
- package/skills/find-journal/references/journal_profiles/British_Journal_of_Radiology.md +39 -0
- package/skills/find-journal/references/journal_profiles/CVIR.md +30 -0
- package/skills/find-journal/references/journal_profiles/Chest.md +39 -0
- package/skills/find-journal/references/journal_profiles/Clinical_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +32 -0
- package/skills/find-journal/references/journal_profiles/Diabetes_Metabolism_Journal.md +36 -0
- package/skills/find-journal/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +32 -0
- package/skills/find-journal/references/journal_profiles/Endocrinology_and_Metabolism.md +37 -0
- package/skills/find-journal/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +39 -0
- package/skills/find-journal/references/journal_profiles/European_Radiology.md +29 -0
- package/skills/find-journal/references/journal_profiles/Hepatology_Communications.md +40 -0
- package/skills/find-journal/references/journal_profiles/Hepatology_International.md +37 -0
- package/skills/find-journal/references/journal_profiles/IEEE_JBHI.md +28 -0
- package/skills/find-journal/references/journal_profiles/IEEE_TMI.md +28 -0
- package/skills/find-journal/references/journal_profiles/INSI.md +29 -0
- package/skills/find-journal/references/journal_profiles/Investigative_Radiology.md +25 -0
- package/skills/find-journal/references/journal_profiles/JACC_Advances.md +41 -0
- package/skills/find-journal/references/journal_profiles/JACC_Asia.md +30 -0
- package/skills/find-journal/references/journal_profiles/JACR.md +28 -0
- package/skills/find-journal/references/journal_profiles/JAMA.md +40 -0
- package/skills/find-journal/references/journal_profiles/JAMA_Network_Open.md +30 -0
- package/skills/find-journal/references/journal_profiles/JCSM.md +39 -0
- package/skills/find-journal/references/journal_profiles/JKMS.md +32 -0
- package/skills/find-journal/references/journal_profiles/JMIR.md +29 -0
- package/skills/find-journal/references/journal_profiles/JMIR_Medical_Education.md +29 -0
- package/skills/find-journal/references/journal_profiles/JNIS.md +35 -0
- package/skills/find-journal/references/journal_profiles/JVIR.md +31 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Biomedical_Informatics.md +29 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +40 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Magnetic_Resonance_Imaging.md +30 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Nuclear_Medicine.md +31 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Stroke.md +32 -0
- package/skills/find-journal/references/journal_profiles/KJR.md +38 -0
- package/skills/find-journal/references/journal_profiles/Korean_Circulation_Journal.md +38 -0
- package/skills/find-journal/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +36 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Diabetes_and_Endocrinology.md +40 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +49 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Infectious_Diseases.md +38 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Neurology.md +39 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Oncology.md +40 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Psychiatry.md +38 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Public_Health.md +30 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Respiratory_Medicine.md +39 -0
- package/skills/find-journal/references/journal_profiles/Liver_International.md +33 -0
- package/skills/find-journal/references/journal_profiles/Medical_Image_Analysis.md +28 -0
- package/skills/find-journal/references/journal_profiles/NEJM.md +33 -0
- package/skills/find-journal/references/journal_profiles/Nature_Machine_Intelligence.md +31 -0
- package/skills/find-journal/references/journal_profiles/Nature_Medicine.md +39 -0
- package/skills/find-journal/references/journal_profiles/Neuroradiology.md +31 -0
- package/skills/find-journal/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +39 -0
- package/skills/find-journal/references/journal_profiles/PLOS_Medicine.md +32 -0
- package/skills/find-journal/references/journal_profiles/RYAI.md +28 -0
- package/skills/find-journal/references/journal_profiles/Radiology.md +29 -0
- package/skills/find-journal/references/journal_profiles/Skeletal_Radiology.md +31 -0
- package/skills/find-journal/references/journal_profiles/Stroke.md +37 -0
- package/skills/find-journal/references/journal_profiles/The_BMJ.md +31 -0
- package/skills/find-journal/references/journal_profiles/The_Lancet.md +31 -0
- package/skills/find-journal/references/journal_profiles/The_Lancet_Digital_Health.md +29 -0
- package/skills/find-journal/references/journal_profiles/World_Journal_of_Hepatology.md +53 -0
- package/skills/find-journal/references/journal_profiles/npj_Digital_Medicine.md +29 -0
- package/skills/find-journal/skill.yml +34 -0
- package/skills/fulltext-retrieval/SKILL.md +174 -0
- package/skills/fulltext-retrieval/fetch_oa.py +433 -0
- package/skills/fulltext-retrieval/pdf_to_md.py +160 -0
- package/skills/fulltext-retrieval/skill.yml +41 -0
- package/skills/generate-codebook/SKILL.md +155 -0
- package/skills/generate-codebook/references/codebook_schema.md +76 -0
- package/skills/generate-codebook/scripts/generate_codebook.py +278 -0
- package/skills/generate-codebook/skill.yml +35 -0
- package/skills/generate-codebook/tests/test_generate_codebook.sh +76 -0
- package/skills/grant-builder/SKILL.md +251 -0
- package/skills/grant-builder/skill.yml +34 -0
- package/skills/humanize/SKILL.md +251 -0
- package/skills/humanize/references/ai_patterns.md +571 -0
- package/skills/humanize/skill.yml +33 -0
- package/skills/intake-project/SKILL.md +264 -0
- package/skills/intake-project/skill.yml +34 -0
- package/skills/lit-sync/SKILL.md +448 -0
- package/skills/lit-sync/references/locale/ko/note_templates.md +110 -0
- package/skills/lit-sync/skill.yml +52 -0
- package/skills/lit-sync/tests/test_poll_logic.sh +92 -0
- package/skills/ma-scout/SKILL.md +640 -0
- package/skills/ma-scout/references/project_readme_template.md +95 -0
- package/skills/ma-scout/references/project_readme_template_ko.md +82 -0
- package/skills/ma-scout/skill.yml +33 -0
- package/skills/make-figures/SKILL.md +957 -0
- package/skills/make-figures/references/critic_rubrics/data_plot.md +166 -0
- package/skills/make-figures/references/critic_rubrics/flow_diagram.md +169 -0
- package/skills/make-figures/references/design_principles.md +181 -0
- package/skills/make-figures/references/exemplar_diagrams/README.md +65 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_input.yaml +37 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_input.yaml +47 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_input.yaml +40 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_input.yaml +43 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_input_pptx.yaml +43 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pptx +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output_600.png +0 -0
- package/skills/make-figures/references/figure_specs.md +291 -0
- package/skills/make-figures/references/flow_diagram_lessons.md +164 -0
- package/skills/make-figures/references/jacc_central_illustration_principles.md +91 -0
- package/skills/make-figures/references/medical_illustration_sources.md +98 -0
- package/skills/make-figures/references/pipeline_concepts_medical_ai.md +240 -0
- package/skills/make-figures/references/reporting_guideline_figure_map.md +104 -0
- package/skills/make-figures/references/visual_abstract_templates/european_radiology.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/jacc_central_illustration.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/medsci_default.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/template_guide.md +114 -0
- package/skills/make-figures/scripts/build_jacc_template.py +77 -0
- package/skills/make-figures/scripts/build_prisma2020_template.py +371 -0
- package/skills/make-figures/scripts/build_strobe_template.py +351 -0
- package/skills/make-figures/scripts/critic_figure.py +264 -0
- package/skills/make-figures/scripts/derive_figure_legend_counts.py +138 -0
- package/skills/make-figures/scripts/extract_exemplar_from_pdf.py +186 -0
- package/skills/make-figures/scripts/fetch_official_templates.sh +88 -0
- package/skills/make-figures/scripts/fill_prisma_template.py +142 -0
- package/skills/make-figures/scripts/generate_flow_diagram.R +133 -0
- package/skills/make-figures/scripts/generate_image.py +99 -0
- package/skills/make-figures/scripts/generate_visual_abstract.py +438 -0
- package/skills/make-figures/scripts/validate_pptx_mac_compat.py +233 -0
- package/skills/make-figures/skill.yml +52 -0
- package/skills/make-figures/templates/official/NOTES.md +62 -0
- package/skills/make-figures/templates/official/consort2010/CONSORT_2025_editable_checklist.docx +0 -0
- package/skills/make-figures/templates/official/consort2010/CONSORT_2025_flow_diagram.docx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v1.pptx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v2.pptx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_updated_v2.pptx +0 -0
- package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_editable_checklist.docx +0 -0
- package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_participant_timeline.docx +0 -0
- package/skills/make-figures/templates/official/stard2015/STARD_2015_checklist.docx +0 -0
- package/skills/make-figures/templates/official/stard2015/STARD_2015_flow_diagram.pdf +0 -0
- package/skills/make-figures/tests/fixtures/figure1_flow.yaml +8 -0
- package/skills/make-figures/tests/fixtures/manuscript_ok.md +9 -0
- package/skills/make-figures/tests/fixtures/manuscript_stale.md +4 -0
- package/skills/make-figures/tests/test_legend_reconcile.sh +36 -0
- package/skills/manage-project/SKILL.md +358 -0
- package/skills/manage-project/references/pre_submission_checklist.md +53 -0
- package/skills/manage-project/references/project_state_template.json +37 -0
- package/skills/manage-project/references/scaffold_templates.md +118 -0
- package/skills/manage-project/references/status_output_format.md +44 -0
- package/skills/manage-project/references/timeline_example.md +20 -0
- package/skills/manage-project/skill.yml +36 -0
- package/skills/manage-project/templates/SSOT.yaml.template +41 -0
- package/skills/manage-refs/LICENSE.zotero-mcp +21 -0
- package/skills/manage-refs/NOTICE.md +29 -0
- package/skills/manage-refs/SKILL.md +289 -0
- package/skills/manage-refs/citation_styles/README.md +40 -0
- package/skills/manage-refs/citation_styles/american-journal-of-roentgenology.csl +211 -0
- package/skills/manage-refs/citation_styles/cardiovascular-and-interventional-radiology.csl +19 -0
- package/skills/manage-refs/citation_styles/european-radiology.csl +19 -0
- package/skills/manage-refs/citation_styles/journal-of-cachexia-sarcopenia-and-muscle.csl +150 -0
- package/skills/manage-refs/citation_styles/journal-of-korean-medical-science-strict.csl +533 -0
- package/skills/manage-refs/citation_styles/journal-of-korean-medical-science.csl +16 -0
- package/skills/manage-refs/citation_styles/korean-journal-of-radiology.csl +155 -0
- package/skills/manage-refs/citation_styles/nature.csl +189 -0
- package/skills/manage-refs/citation_styles/nlm-citation-sequence.csl +535 -0
- package/skills/manage-refs/citation_styles/radiology.csl +228 -0
- package/skills/manage-refs/citation_styles/springer-basic-brackets.csl +187 -0
- package/skills/manage-refs/citation_styles/springer-vancouver-brackets.csl +276 -0
- package/skills/manage-refs/citation_styles/vancouver-superscript.csl +536 -0
- package/skills/manage-refs/citation_styles/vancouver.csl +535 -0
- package/skills/manage-refs/references/REFERENCE_STYLE_SPECS.md +59 -0
- package/skills/manage-refs/references/check_xref_symptoms.md +35 -0
- package/skills/manage-refs/scripts/_vendor_citation_writer.py +600 -0
- package/skills/manage-refs/scripts/check_citation_keys.py +112 -0
- package/skills/manage-refs/scripts/check_csl_render.py +102 -0
- package/skills/manage-refs/scripts/check_xref.py +633 -0
- package/skills/manage-refs/scripts/fill_journal_abbrev.py +104 -0
- package/skills/manage-refs/scripts/inject_zotero_cwyw.py +133 -0
- package/skills/manage-refs/scripts/md_marker_convert.py +193 -0
- package/skills/manage-refs/scripts/pre_submission_gate.sh +238 -0
- package/skills/manage-refs/scripts/render_pandoc.sh +88 -0
- package/skills/manage-refs/skill.yml +70 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/README.md +32 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/manuscript.md +10 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/refs.bib +34 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/run.sh +117 -0
- package/skills/manage-refs/tests/test_vN_docx_check.sh +145 -0
- package/skills/meta-analysis/SKILL.md +739 -0
- package/skills/meta-analysis/references/LICENSES.md +21 -0
- package/skills/meta-analysis/references/PROSPERO_template.md +221 -0
- package/skills/meta-analysis/references/ai_pre_screening_template.py +245 -0
- package/skills/meta-analysis/references/checklists/JBI_Case_Series.md +45 -0
- package/skills/meta-analysis/references/checklists/NOS.md +88 -0
- package/skills/meta-analysis/references/checklists/PRISMA_DTA.md +36 -0
- package/skills/meta-analysis/references/checklists/PROBAST.md +75 -0
- package/skills/meta-analysis/references/checklists/QUADAS2.md +77 -0
- package/skills/meta-analysis/references/checklists/ROBINS_I.md +87 -0
- package/skills/meta-analysis/references/checklists/RoB2.md +79 -0
- package/skills/meta-analysis/references/data_integrity_checklist.md +57 -0
- package/skills/meta-analysis/references/icmje_coi_guide.md +181 -0
- package/skills/meta-analysis/references/phase10_recovery.md +136 -0
- package/skills/meta-analysis/references/phase4_km_composite.md +58 -0
- package/skills/meta-analysis/references/phase6_statistical_synthesis.md +148 -0
- package/skills/meta-analysis/references/phase9_circulation.md +84 -0
- package/skills/meta-analysis/references/post_submission_release_ops.md +41 -0
- package/skills/meta-analysis/references/r_templates.md +132 -0
- package/skills/meta-analysis/references/review_orchestration.md +40 -0
- package/skills/meta-analysis/references/submission_package_drift.md +71 -0
- package/skills/meta-analysis/scripts/check_pool_consistency.py +201 -0
- package/skills/meta-analysis/scripts/cohort_overlap_check.py +242 -0
- package/skills/meta-analysis/scripts/dta_extraction_qc.py +137 -0
- package/skills/meta-analysis/scripts/screening_reconcile.py +160 -0
- package/skills/meta-analysis/skill.yml +47 -0
- package/skills/meta-analysis/templates/FINAL_POOL_LOCK.yaml.template +70 -0
- package/skills/meta-analysis/templates/extraction_form_v2.md +129 -0
- package/skills/meta-analysis/templates/supplementary_8file_checklist.md +94 -0
- package/skills/meta-analysis/tests/test_pool_consistency.sh +123 -0
- package/skills/orchestrate/SKILL.md +501 -0
- package/skills/orchestrate/references/dialogue_nodes.md +196 -0
- package/skills/orchestrate/references/report_template.md +109 -0
- package/skills/orchestrate/references/report_template_ko.md +88 -0
- package/skills/orchestrate/skill.yml +44 -0
- package/skills/peer-review/SKILL.md +381 -0
- package/skills/peer-review/references/aczel_2021_reviewer2_patterns.md +88 -0
- package/skills/peer-review/references/domain-probes/ai_overclaiming.md +47 -0
- package/skills/peer-review/references/domain-probes/narrative_review.md +44 -0
- package/skills/peer-review/references/domain-probes/observational_confounding.md +48 -0
- package/skills/peer-review/references/domain-probes/radiomics.md +38 -0
- package/skills/peer-review/references/domain-probes/sr_ma.md +87 -0
- package/skills/peer-review/references/domain-probes/survival_prognostic.md +68 -0
- package/skills/peer-review/references/exemplar_reviews/README.md +43 -0
- package/skills/peer-review/references/exemplar_reviews/ai_overclaiming.md +47 -0
- package/skills/peer-review/references/exemplar_reviews/calibration_missing.md +44 -0
- package/skills/peer-review/references/exemplar_reviews/data_leakage.md +48 -0
- package/skills/peer-review/references/exemplar_reviews/reference_standard_validity.md +45 -0
- package/skills/peer-review/references/narrative_review_audit.md +67 -0
- package/skills/peer-review/references/reviewer_calibration/README.md +34 -0
- package/skills/peer-review/references/reviewer_calibration/compliance_floor.md +52 -0
- package/skills/peer-review/references/reviewer_profiles/AJR.md +82 -0
- package/skills/peer-review/references/reviewer_profiles/EURE.md +64 -0
- package/skills/peer-review/references/reviewer_profiles/INSI.md +57 -0
- package/skills/peer-review/references/reviewer_profiles/KJR.md +100 -0
- package/skills/peer-review/references/reviewer_profiles/README.md +32 -0
- package/skills/peer-review/references/reviewer_profiles/RYAI.md +86 -0
- package/skills/peer-review/skill.yml +39 -0
- package/skills/present-paper/SKILL.md +675 -0
- package/skills/present-paper/references/critic_rubrics/slide.md +155 -0
- package/skills/present-paper/references/generate_pptx_templates.py +604 -0
- package/skills/present-paper/references/medical_presentation_templates.md +277 -0
- package/skills/present-paper/references/slide_design_principles.md +202 -0
- package/skills/present-paper/references/slide_visual_styles/nature_lancet.md +168 -0
- package/skills/present-paper/references/workflow-checklist.md +109 -0
- package/skills/present-paper/scripts/extract_pdf_figures.py +243 -0
- package/skills/present-paper/scripts/inject_pronunciation_notes.py +178 -0
- package/skills/present-paper/scripts/inject_speaker_notes.py +133 -0
- package/skills/present-paper/scripts/strip_notes_for_sharing.py +140 -0
- package/skills/present-paper/scripts/trim_caption.py +271 -0
- package/skills/present-paper/skill.yml +41 -0
- package/skills/present-paper/templates/build_pptx_nature_lancet.py +688 -0
- package/skills/publish-skill/SKILL.md +370 -0
- package/skills/publish-skill/references/license-compatibility-matrix.md +132 -0
- package/skills/publish-skill/references/pii-patterns.md +130 -0
- package/skills/publish-skill/scripts/audit_skill.sh +278 -0
- package/skills/publish-skill/skill.yml +35 -0
- package/skills/render-pdf-doc/SKILL.md +146 -0
- package/skills/render-pdf-doc/references/known_pitfalls.md +53 -0
- package/skills/render-pdf-doc/references/pandoc_korean_cheatsheet.md +77 -0
- package/skills/render-pdf-doc/scripts/check_deps.sh +42 -0
- package/skills/render-pdf-doc/scripts/infer_colwidths.py +164 -0
- package/skills/render-pdf-doc/scripts/render_pdf.sh +98 -0
- package/skills/render-pdf-doc/skill.yml +57 -0
- package/skills/render-pdf-doc/templates/anchor-doc.md +27 -0
- package/skills/render-pdf-doc/templates/anchor-doc_ko.md +25 -0
- package/skills/render-pdf-doc/templates/briefing-handout.md +33 -0
- package/skills/render-pdf-doc/templates/briefing-handout_ko.md +31 -0
- package/skills/render-pdf-doc/templates/proposal-cover.md +33 -0
- package/skills/render-pdf-doc/templates/proposal-cover_ko.md +31 -0
- package/skills/render-pdf-doc/templates/reference-table.md +22 -0
- package/skills/render-pdf-doc/templates/reference-table_ko.md +20 -0
- package/skills/replicate-study/SKILL.md +150 -0
- package/skills/replicate-study/references/harmonization_3country.csv +47 -0
- package/skills/replicate-study/references/harmonization_knhanes_nhanes.csv +68 -0
- package/skills/replicate-study/references/methodology_extraction_template.md +134 -0
- package/skills/replicate-study/skill.yml +37 -0
- package/skills/review-paper/SKILL.md +104 -0
- package/skills/review-paper/references/macro_skeleton.md +6 -0
- package/skills/review-paper/skill.yml +25 -0
- package/skills/revise/SKILL.md +515 -0
- package/skills/revise/references/r2r_voice.md +346 -0
- package/skills/revise/skill.yml +43 -0
- package/skills/search-lit/SKILL.md +443 -0
- package/skills/search-lit/references/parse_pubmed.py +326 -0
- package/skills/search-lit/references/pubmed_eutils.sh +111 -0
- package/skills/search-lit/skill.yml +46 -0
- package/skills/self-review/SKILL.md +1045 -0
- package/skills/self-review/references/domain-probes/ai_overclaiming.md +47 -0
- package/skills/self-review/references/domain-probes/narrative_review.md +44 -0
- package/skills/self-review/references/domain-probes/observational_confounding.md +48 -0
- package/skills/self-review/references/domain-probes/radiomics.md +38 -0
- package/skills/self-review/references/domain-probes/sr_ma.md +87 -0
- package/skills/self-review/references/domain-probes/survival_prognostic.md +68 -0
- package/skills/self-review/references/exemplar_findings/README.md +43 -0
- package/skills/self-review/references/exemplar_findings/cohort_arithmetic_mismatch.md +35 -0
- package/skills/self-review/references/exemplar_findings/estimand_drift_posthoc_primary.md +39 -0
- package/skills/self-review/references/exemplar_findings/scope_overreach_cross_sectional.md +35 -0
- package/skills/self-review/references/exemplar_findings/unadjusted_confounder.md +36 -0
- package/skills/self-review/references/panel_review_template.md +177 -0
- package/skills/self-review/scripts/check_artifact_coverage.py +301 -0
- package/skills/self-review/scripts/check_claim_artifact.py +248 -0
- package/skills/self-review/scripts/check_classical_style.py +185 -0
- package/skills/self-review/scripts/check_cohort_arithmetic.py +481 -0
- package/skills/self-review/scripts/check_confounding_completeness.py +287 -0
- package/skills/self-review/scripts/check_panel_diversity.py +336 -0
- package/skills/self-review/scripts/check_reference_adequacy.py +392 -0
- package/skills/self-review/scripts/check_reviewer_team_consistency.py +412 -0
- package/skills/self-review/scripts/check_scope_coherence.py +177 -0
- package/skills/self-review/skill.yml +47 -0
- package/skills/self-review/tests/fixtures/claim_manuscript.md +17 -0
- package/skills/self-review/tests/fixtures/claim_prereg.md +6 -0
- package/skills/self-review/tests/fixtures/cohort_bad.md +21 -0
- package/skills/self-review/tests/fixtures/cohort_clean.md +21 -0
- package/skills/self-review/tests/fixtures/cohort_partition.csv +5 -0
- package/skills/self-review/tests/fixtures/coverage_analysis/31_delong_nested_added_value.csv +3 -0
- package/skills/self-review/tests/fixtures/coverage_analysis/table1_demographics.csv +3 -0
- package/skills/self-review/tests/fixtures/coverage_clean.md +13 -0
- package/skills/self-review/tests/fixtures/coverage_manuscript.md +11 -0
- package/skills/self-review/tests/fixtures/panel_collapse.json +27 -0
- package/skills/self-review/tests/fixtures/panel_good.json +32 -0
- package/skills/self-review/tests/fixtures/panel_monoculture.json +32 -0
- package/skills/self-review/tests/fixtures/refadeq_letter.md +13 -0
- package/skills/self-review/tests/fixtures/refadeq_original_fixed.md +42 -0
- package/skills/self-review/tests/fixtures/refadeq_original_uncited.md +40 -0
- package/skills/self-review/tests/fixtures/scope_bad.md +9 -0
- package/skills/self-review/tests/fixtures/scope_clean.md +8 -0
- package/skills/self-review/tests/fixtures/scope_surrogate.md +8 -0
- package/skills/self-review/tests/fixtures/style_bad.md +13 -0
- package/skills/self-review/tests/fixtures/style_clean.md +11 -0
- package/skills/self-review/tests/fixtures/table1_by_exposure.csv +11 -0
- package/skills/self-review/tests/test_artifact_coverage.sh +44 -0
- package/skills/self-review/tests/test_claim_artifact.sh +50 -0
- package/skills/self-review/tests/test_classical_style.sh +44 -0
- package/skills/self-review/tests/test_cohort_arithmetic.sh +49 -0
- package/skills/self-review/tests/test_confounding_completeness.sh +66 -0
- package/skills/self-review/tests/test_panel_diversity.sh +55 -0
- package/skills/self-review/tests/test_panel_mode.sh +69 -0
- package/skills/self-review/tests/test_reference_adequacy.sh +68 -0
- package/skills/self-review/tests/test_reviewer_team_consistency.sh +138 -0
- package/skills/self-review/tests/test_scope_coherence.sh +46 -0
- package/skills/setup-medsci/SKILL.md +110 -0
- package/skills/setup-medsci/references/setup-checklist.md +51 -0
- package/skills/setup-medsci/skill.yml +30 -0
- package/skills/sync-submission/SKILL.md +382 -0
- package/skills/sync-submission/scripts/author_registry_example.yaml +36 -0
- package/skills/sync-submission/scripts/blind_sweep.py +203 -0
- package/skills/sync-submission/scripts/check_asset_anonymization.py +300 -0
- package/skills/sync-submission/scripts/check_cross_artifact_stale.py +211 -0
- package/skills/sync-submission/scripts/cover_letter_drift_check.py +451 -0
- package/skills/sync-submission/scripts/cross_document_n_check.py +486 -0
- package/skills/sync-submission/scripts/detect_copy_divergence.py +136 -0
- package/skills/sync-submission/scripts/preflight_gate.py +458 -0
- package/skills/sync-submission/scripts/scope_drift_check.py +362 -0
- package/skills/sync-submission/scripts/sync_submission.py +169 -0
- package/skills/sync-submission/skill.yml +43 -0
- package/skills/sync-submission/tests/fixtures/copy_ok.md +5 -0
- package/skills/sync-submission/tests/fixtures/copy_stale.md +5 -0
- package/skills/sync-submission/tests/fixtures/ssot.md +5 -0
- package/skills/sync-submission/tests/test_asset_anonymization.sh +99 -0
- package/skills/sync-submission/tests/test_copy_divergence.sh +44 -0
- package/skills/sync-submission/tests/test_cross_artifact_stale.sh +80 -0
- package/skills/sync-submission/tests/test_cross_document_n.sh +132 -0
- package/skills/sync-submission/tests/test_preflight_gate.sh +112 -0
- package/skills/sync-submission/tests/test_scope_drift.sh +122 -0
- package/skills/sync-submission/tests/test_vN_docx_assertion.sh +51 -0
- package/skills/verify-refs/SKILL.md +177 -0
- package/skills/verify-refs/references/manual_checkpoint_guide.md +100 -0
- package/skills/verify-refs/scripts/verify_cli.sh +62 -0
- package/skills/verify-refs/scripts/verify_refs.py +782 -0
- package/skills/verify-refs/skill.yml +44 -0
- package/skills/verify-refs/tests/fixtures/pagination_placeholder.bib +17 -0
- package/skills/verify-refs/tests/test_pagination_placeholder.sh +42 -0
- package/skills/version-dataset/SKILL.md +143 -0
- package/skills/version-dataset/references/manifest_schema.md +72 -0
- package/skills/version-dataset/scripts/version_dataset.py +242 -0
- package/skills/version-dataset/skill.yml +35 -0
- package/skills/version-dataset/tests/test_version_dataset.sh +52 -0
- package/skills/write-paper/SKILL.md +1148 -0
- package/skills/write-paper/references/exemplar_methods/README.md +38 -0
- package/skills/write-paper/references/exemplar_methods/ai_validation_tripod_claim.md +47 -0
- package/skills/write-paper/references/exemplar_methods/diagnostic_accuracy_stard.md +50 -0
- package/skills/write-paper/references/exemplar_methods/observational_cohort_strobe.md +43 -0
- package/skills/write-paper/references/journal_profiles/AJNR.md +185 -0
- package/skills/write-paper/references/journal_profiles/AJR.md +149 -0
- package/skills/write-paper/references/journal_profiles/Abdominal_Radiology.md +139 -0
- package/skills/write-paper/references/journal_profiles/Academic_Radiology.md +90 -0
- package/skills/write-paper/references/journal_profiles/Annals_of_Internal_Medicine.md +150 -0
- package/skills/write-paper/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +82 -0
- package/skills/write-paper/references/journal_profiles/British_Journal_of_Radiology.md +161 -0
- package/skills/write-paper/references/journal_profiles/CVIR.md +157 -0
- package/skills/write-paper/references/journal_profiles/Chest.md +270 -0
- package/skills/write-paper/references/journal_profiles/Clinical_Radiology.md +160 -0
- package/skills/write-paper/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +147 -0
- package/skills/write-paper/references/journal_profiles/Diabetes_Metabolism_Journal.md +163 -0
- package/skills/write-paper/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +216 -0
- package/skills/write-paper/references/journal_profiles/Endocrinology_and_Metabolism.md +167 -0
- package/skills/write-paper/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +192 -0
- package/skills/write-paper/references/journal_profiles/European_Radiology.md +159 -0
- package/skills/write-paper/references/journal_profiles/Hepatology_Communications.md +110 -0
- package/skills/write-paper/references/journal_profiles/Hepatology_International.md +106 -0
- package/skills/write-paper/references/journal_profiles/IEEE_TMI.md +180 -0
- package/skills/write-paper/references/journal_profiles/INSI.md +163 -0
- package/skills/write-paper/references/journal_profiles/Investigative_Radiology.md +86 -0
- package/skills/write-paper/references/journal_profiles/JACC_Advances.md +197 -0
- package/skills/write-paper/references/journal_profiles/JACC_Asia.md +168 -0
- package/skills/write-paper/references/journal_profiles/JACR.md +87 -0
- package/skills/write-paper/references/journal_profiles/JAMA.md +188 -0
- package/skills/write-paper/references/journal_profiles/JAMA_Network_Open.md +170 -0
- package/skills/write-paper/references/journal_profiles/JCSM.md +266 -0
- package/skills/write-paper/references/journal_profiles/JKMS.md +201 -0
- package/skills/write-paper/references/journal_profiles/JMIR.md +88 -0
- package/skills/write-paper/references/journal_profiles/JMIR_Medical_Education.md +86 -0
- package/skills/write-paper/references/journal_profiles/JNIS.md +227 -0
- package/skills/write-paper/references/journal_profiles/JVIR.md +158 -0
- package/skills/write-paper/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +191 -0
- package/skills/write-paper/references/journal_profiles/Journal_of_Stroke.md +176 -0
- package/skills/write-paper/references/journal_profiles/KJR.md +185 -0
- package/skills/write-paper/references/journal_profiles/Korean_Circulation_Journal.md +184 -0
- package/skills/write-paper/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +178 -0
- package/skills/write-paper/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +127 -0
- package/skills/write-paper/references/journal_profiles/Liver_International.md +165 -0
- package/skills/write-paper/references/journal_profiles/Medical_Image_Analysis.md +147 -0
- package/skills/write-paper/references/journal_profiles/NEJM.md +147 -0
- package/skills/write-paper/references/journal_profiles/Nature_Medicine.md +181 -0
- package/skills/write-paper/references/journal_profiles/Neuroradiology.md +151 -0
- package/skills/write-paper/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +184 -0
- package/skills/write-paper/references/journal_profiles/PLOS_Medicine.md +166 -0
- package/skills/write-paper/references/journal_profiles/RYAI.md +124 -0
- package/skills/write-paper/references/journal_profiles/Radiology.md +173 -0
- package/skills/write-paper/references/journal_profiles/Skeletal_Radiology.md +135 -0
- package/skills/write-paper/references/journal_profiles/Stroke.md +210 -0
- package/skills/write-paper/references/journal_profiles/The_BMJ.md +121 -0
- package/skills/write-paper/references/journal_profiles/The_Lancet.md +112 -0
- package/skills/write-paper/references/journal_profiles/The_Lancet_Digital_Health.md +104 -0
- package/skills/write-paper/references/journal_profiles/World_Journal_of_Hepatology.md +106 -0
- package/skills/write-paper/references/journal_profiles/npj_Digital_Medicine.md +93 -0
- package/skills/write-paper/references/paper_types/ai_validation.md +270 -0
- package/skills/write-paper/references/paper_types/animal_study.md +194 -0
- package/skills/write-paper/references/paper_types/case_report.md +237 -0
- package/skills/write-paper/references/paper_types/cross_national.md +328 -0
- package/skills/write-paper/references/paper_types/letter.md +127 -0
- package/skills/write-paper/references/paper_types/meta_analysis.md +181 -0
- package/skills/write-paper/references/paper_types/nhis_cohort.md +297 -0
- package/skills/write-paper/references/paper_types/original_article.md +221 -0
- package/skills/write-paper/references/paper_types/technical_note.md +131 -0
- package/skills/write-paper/references/section_guides/discussion.md +155 -0
- package/skills/write-paper/references/section_guides/introduction.md +108 -0
- package/skills/write-paper/references/section_guides/methods.md +144 -0
- package/skills/write-paper/references/section_guides/results.md +113 -0
- package/skills/write-paper/references/section_guides/step7_1_classical_qc.md +67 -0
- package/skills/write-paper/references/section_guides/step7_4a_audit_recovery.md +74 -0
- package/skills/write-paper/references/section_guides/title_abstract.md +123 -0
- package/skills/write-paper/references/section_templates/methods_statistical.md +147 -0
- package/skills/write-paper/scripts/check_placeholders.py +182 -0
- package/skills/write-paper/skill.yml +48 -0
- package/skills/write-paper/tests/test_placeholders.sh +107 -0
- package/skills/write-protocol/SKILL.md +243 -0
- package/skills/write-protocol/references/ethics_checklist.md +150 -0
- package/skills/write-protocol/references/protocol_template.md +304 -0
- package/skills/write-protocol/skill.yml +34 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
schema_version: 2
|
|
2
|
+
name: author-strategy
|
|
3
|
+
layer: D
|
|
4
|
+
owner_domain: author_profile_analysis
|
|
5
|
+
|
|
6
|
+
when_to_use: "Analyze a PubMed author profile (study-type mix, trends) and produce a strategy report."
|
|
7
|
+
when_NOT_to_use: "Finding meta-analysis topics (use ma-scout); literature search for a manuscript (use search-lit)."
|
|
8
|
+
|
|
9
|
+
inputs:
|
|
10
|
+
- "author name / PubMed identifier"
|
|
11
|
+
outputs:
|
|
12
|
+
- "study-type classification"
|
|
13
|
+
- "profile visualization"
|
|
14
|
+
- "strategy report"
|
|
15
|
+
side_effects:
|
|
16
|
+
- writes_report_artifacts
|
|
17
|
+
- network_access_pubmed
|
|
18
|
+
downstream_consumers:
|
|
19
|
+
- ma-scout
|
|
20
|
+
forbidden_actions:
|
|
21
|
+
- fabricate_publication_records
|
|
22
|
+
- infer_identity_without_disambiguation
|
|
23
|
+
|
|
24
|
+
# v2.1 quality card
|
|
25
|
+
purpose: "Summarize an author's PubMed publication profile and surface strategy options from the actual record."
|
|
26
|
+
safety_boundaries:
|
|
27
|
+
- "Records are fetched from PubMed, not recalled from memory; author disambiguation is explicit."
|
|
28
|
+
- "Reports describe the public record only; no private or speculative attribution."
|
|
29
|
+
known_limitations:
|
|
30
|
+
- "Name collisions on PubMed can blur profiles; disambiguation is best-effort."
|
|
31
|
+
- "No standalone demo; output is an advisory report."
|
|
32
|
+
validation_commands:
|
|
33
|
+
- "manual review of the fetched record against PubMed"
|
|
34
|
+
evidence_surface: manual_workflow
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: batch-cohort
|
|
3
|
+
description: Generate N analysis scripts from a single methodology template × multiple exposure/outcome combinations. The "80-person team" pattern — same validated method, swap variables only. Produces batch R/Python code + summary matrix.
|
|
4
|
+
triggers: batch cohort, batch analysis, 대량 분석, 변수 교체, variable swap, mass production, 80명 팀, batch generate, 일괄 코드 생성, exposure outcome matrix, combinatorial analysis
|
|
5
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
|
+
model: opus
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Batch Cohort Analysis Skill
|
|
10
|
+
|
|
11
|
+
You are assisting a medical researcher in generating multiple analysis scripts from a single
|
|
12
|
+
validated methodology template, each differing only in the exposure/outcome variable combination.
|
|
13
|
+
This replicates the "80-person research team" pattern: one PI designs the methodology, and
|
|
14
|
+
many researchers execute the same approach with different variable swaps.
|
|
15
|
+
|
|
16
|
+
## When to Use
|
|
17
|
+
|
|
18
|
+
- Researcher has a **validated analysis template** (e.g., from /replicate-study or /cross-national)
|
|
19
|
+
- Wants to explore **multiple exposure → outcome combinations** on the same database
|
|
20
|
+
- Goal: systematic variable-swap code generation + batch execution + result matrix
|
|
21
|
+
|
|
22
|
+
## Inputs
|
|
23
|
+
|
|
24
|
+
1. **Database path(s)**: CSV/SAS data files (KNHANES, NHANES, NHIS, or any cleaned cohort)
|
|
25
|
+
2. **Methodology template**: One of:
|
|
26
|
+
- Path to a validated R/Python analysis script (from /replicate-study or /cross-national)
|
|
27
|
+
- A paper type template name: `nhis_cohort`, `cross_national`, `survey_weighted`
|
|
28
|
+
- A source paper to extract methodology from (falls back to /replicate-study Phase 1)
|
|
29
|
+
3. **Combination spec**: A list of exposure/outcome pairs, provided as:
|
|
30
|
+
- Inline list: `exposures: [depression, obesity, smoking]; outcomes: [diabetes, hypertension, CVD]`
|
|
31
|
+
- CSV file with columns: `exposure`, `outcome`, (optional) `subgroup_vars`
|
|
32
|
+
- `"all"` keyword: generates all pairwise combinations from the lists
|
|
33
|
+
|
|
34
|
+
### Optional Inputs
|
|
35
|
+
|
|
36
|
+
- **Covariate set**: Fixed covariate list for all analyses (default: use template's set)
|
|
37
|
+
- **Subgroup variables**: Variables to stratify by (default: sex, age group)
|
|
38
|
+
- **Output format**: `code_only` (just scripts) | `execute` (run + collect results) | `full` (code + results + summary)
|
|
39
|
+
- **Cross-national mode**: If TRUE, generates paired scripts for both countries per combination
|
|
40
|
+
|
|
41
|
+
## Workflow
|
|
42
|
+
|
|
43
|
+
### Phase 1: Template Validation
|
|
44
|
+
|
|
45
|
+
1. Read the methodology template (R script or paper type reference).
|
|
46
|
+
2. Identify the **slot variables** — parts that change per combination:
|
|
47
|
+
- `EXPOSURE_VAR`: raw variable name in the database
|
|
48
|
+
- `EXPOSURE_LABEL`: human-readable label for tables/figures
|
|
49
|
+
- `EXPOSURE_CODING`: how to derive binary/categorical exposure
|
|
50
|
+
- `OUTCOME_VAR`: raw variable name
|
|
51
|
+
- `OUTCOME_LABEL`: human-readable label
|
|
52
|
+
- `OUTCOME_CODING`: how to derive binary outcome
|
|
53
|
+
3. Verify the template runs successfully on at least one combination before batch generation.
|
|
54
|
+
4. Output: template summary with identified slots → user approval.
|
|
55
|
+
|
|
56
|
+
### Phase 2: Variable Specification
|
|
57
|
+
|
|
58
|
+
For each exposure and outcome in the combination spec:
|
|
59
|
+
|
|
60
|
+
1. **Look up** the variable in the database:
|
|
61
|
+
- KNHANES: check variable name exists in the CSV header
|
|
62
|
+
- NHANES: check which table contains the variable (use codebook.csv if available)
|
|
63
|
+
- NHIS: check claims code or variable name
|
|
64
|
+
2. **Define coding**:
|
|
65
|
+
- Binary: threshold or category mapping (e.g., `HE_glu >= 126 → diabetes = 1`)
|
|
66
|
+
- Categorical: level definitions (e.g., `smoking: current/former/never`)
|
|
67
|
+
3. **Check covariate overlap**: If the exposure IS one of the standard covariates, remove it from the adjustment set for that analysis (no self-adjustment).
|
|
68
|
+
4. Output: **combination matrix** with all variable specifications.
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
| # | Exposure | Exposure Coding | Outcome | Outcome Coding | Covariates (adjusted) | Notes |
|
|
72
|
+
|---|----------|-----------------|---------|----------------|----------------------|-------|
|
|
73
|
+
| 1 | Depression (PHQ≥10) | BP_PHQ sum ≥10 | Diabetes | HE_glu≥126|HbA1c≥6.5|DE1_dg=1 | age,sex,edu,income,smoking,alcohol,obesity,CVD | — |
|
|
74
|
+
| 2 | Obesity (BMI≥25) | HE_obe ≥4 | Diabetes | same | age,sex,edu,income,smoking,alcohol,depression,CVD | obesity removed from covariates |
|
|
75
|
+
| ... | | | | | | |
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Phase 3: Batch Code Generation
|
|
79
|
+
|
|
80
|
+
For each combination in the matrix:
|
|
81
|
+
|
|
82
|
+
1. **Clone** the template script.
|
|
83
|
+
2. **Replace** slot variables with the combination-specific values.
|
|
84
|
+
3. **Adjust covariates**: Remove exposure variable from covariate list if present.
|
|
85
|
+
4. **Set output paths**: Each combination gets its own results subdirectory.
|
|
86
|
+
5. **Generate a master runner script** (`run_all.R` or `run_all.sh`) that:
|
|
87
|
+
- Executes all N scripts sequentially (or in parallel via `future`/`parallel`)
|
|
88
|
+
- Captures errors per script without stopping the batch
|
|
89
|
+
- Logs execution time per analysis
|
|
90
|
+
|
|
91
|
+
### Phase 4: Batch Execution (if `execute` or `full` mode)
|
|
92
|
+
|
|
93
|
+
1. Run the master script.
|
|
94
|
+
2. Collect results from each combination's output directory.
|
|
95
|
+
3. Handle failures gracefully:
|
|
96
|
+
- Log which combinations failed and why
|
|
97
|
+
- Common failures: convergence issues, too few events, empty subgroups
|
|
98
|
+
- Suggest fixes for failed combinations
|
|
99
|
+
|
|
100
|
+
### Phase 5: Summary Matrix
|
|
101
|
+
|
|
102
|
+
Aggregate all results into a single summary:
|
|
103
|
+
|
|
104
|
+
**Main Results Matrix** (`summary_matrix.csv`):
|
|
105
|
+
|
|
106
|
+
| Exposure | Outcome | N | Events | Model 1 OR (95% CI) | Model 2 OR (95% CI) | Model 3 OR (95% CI) | p-value | Significant |
|
|
107
|
+
|----------|---------|---|--------|---------------------|---------------------|---------------------|---------|-------------|
|
|
108
|
+
| Depression | Diabetes | 5,811 | 487 | 2.14 (1.52–3.01) | 1.89 (1.33–2.69) | 1.36 (0.91–2.05) | 0.137 | No |
|
|
109
|
+
| Obesity | Diabetes | 5,811 | 487 | 3.45 (2.71–4.39) | 3.38 (2.65–4.32) | 3.12 (2.42–4.02) | <0.001 | Yes |
|
|
110
|
+
| ... | | | | | | | | |
|
|
111
|
+
|
|
112
|
+
**Subgroup Summary** (`subgroup_matrix.csv`): Same format, stratified by subgroup variables.
|
|
113
|
+
|
|
114
|
+
**Heatmap** (optional): Visual matrix of effect sizes × significance, exposure on Y-axis, outcome on X-axis.
|
|
115
|
+
|
|
116
|
+
## Output Files
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
{working_dir}/batch_{timestamp}/
|
|
120
|
+
├── README.md — Batch run summary (N combinations, template used, date)
|
|
121
|
+
├── combination_matrix.csv — All exposure/outcome specs with coding
|
|
122
|
+
├── template/
|
|
123
|
+
│ └── base_template.R — The validated template (frozen copy)
|
|
124
|
+
├── scripts/
|
|
125
|
+
│ ├── 01_depression_diabetes.R
|
|
126
|
+
│ ├── 02_obesity_diabetes.R
|
|
127
|
+
│ ├── ...
|
|
128
|
+
│ └── run_all.R — Master execution script
|
|
129
|
+
├── results/
|
|
130
|
+
│ ├── 01_depression_diabetes/
|
|
131
|
+
│ │ ├── table1.csv
|
|
132
|
+
│ │ ├── main_results.csv
|
|
133
|
+
│ │ └── subgroup_results.csv
|
|
134
|
+
│ ├── 02_obesity_diabetes/
|
|
135
|
+
│ │ └── ...
|
|
136
|
+
│ └── ...
|
|
137
|
+
├── summary/
|
|
138
|
+
│ ├── summary_matrix.csv — Main results across all combinations
|
|
139
|
+
│ ├── subgroup_matrix.csv — Subgroup results across all combinations
|
|
140
|
+
│ ├── failed_runs.csv — Combinations that failed + error messages
|
|
141
|
+
│ └── heatmap.png — Optional effect size × significance visual
|
|
142
|
+
└── logs/
|
|
143
|
+
└── batch_execution.log — Timing + error log
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Critical Rules
|
|
147
|
+
|
|
148
|
+
1. **Never modify the core methodology** across combinations — only swap exposure/outcome/covariates.
|
|
149
|
+
2. **Remove self-adjustment**: If exposure = BMI, remove obesity from covariates. If exposure = education/income, remove the same variable from covariates. If outcome = MetS, consider removing obesity from covariates. Document all removals.
|
|
150
|
+
3. **Weighted analysis mandatory** for KNHANES/NHANES/NHIS — inherited from template.
|
|
151
|
+
4. **Event count check**: Before running, verify each outcome has ≥10 events per covariate (EPV rule). Flag underpowered combinations.
|
|
152
|
+
5. **Multiple comparisons**: When generating >5 combinations, include a Bonferroni-corrected significance column in the summary matrix. Add a note about exploratory vs confirmatory framing.
|
|
153
|
+
6. **Reproducibility**: Freeze the template version. Include a SHA256 hash of the data file in README.
|
|
154
|
+
7. **No p-hacking framing**: The summary matrix is for **hypothesis generation**, not confirmation. State this explicitly in README and any manuscript output.
|
|
155
|
+
8. **Outcome definitions MUST include physician diagnosis**: Diabetes = FPG≥126 OR HbA1c≥6.5 OR physician-diagnosed (KNHANES: DE1_dg=1, NHANES: DIQ010="Yes"). Hypertension = SBP≥140 OR DBP≥90 OR physician-diagnosed (KNHANES: DI1_dg=1, NHANES: BPQ020="Yes"). Lab-only definitions systematically overestimate exposure→outcome associations (validated: Joo 2026 replication showed US depression→DM wOR 1.92 without vs 1.54 with physician dx).
|
|
156
|
+
9. **Full covariate set is default**: Always use 8 covariates (age, sex, education, income, smoking, alcohol, obesity, CVD) unless explicitly justified. Minimal models (age+sex+BMI only) overestimate effects due to residual confounding.
|
|
157
|
+
10. **Generated-code quality gate**: Because this skill emits N near-identical scripts, a single reproducibility slip (a missing seed, an absolute path, a hand-typed data literal) replicates across the whole batch. After Phase 3, lint the generated scripts with the `/analyze-stats` code-quality gate (`check_generated_code.py --code-dir {batch_dir} --strict`) and clear every Major (`MISSING_SEED`, `HARDCODED_DATA_LITERAL`, `HARDCODED_ABS_PATH`, `INPLACE_SOURCE_OVERWRITE`) before batch execution.
|
|
158
|
+
|
|
159
|
+
## Cross-National Batch Mode
|
|
160
|
+
|
|
161
|
+
When `cross_national: true`:
|
|
162
|
+
- Generate paired scripts for each combination (Korea + US)
|
|
163
|
+
- Summary matrix includes both countries side-by-side
|
|
164
|
+
- Direction agreement column: ✓ if both countries show same direction of effect
|
|
165
|
+
- Uses /cross-national skill's dual-survey-design approach
|
|
166
|
+
|
|
167
|
+
## Integration with Upstream Skills
|
|
168
|
+
|
|
169
|
+
| Need | Skill |
|
|
170
|
+
|------|-------|
|
|
171
|
+
| Variable coding lookup | `analyze-stats` survey_weighted guide |
|
|
172
|
+
| Template creation from paper | `/replicate-study` Phase 1–3 |
|
|
173
|
+
| Cross-national paired analysis | `/cross-national` |
|
|
174
|
+
| ICD-10 claims algorithms | `analyze-stats` nhis_icd10_mapping guide |
|
|
175
|
+
| Write manuscript from results | `/write-paper` (nhis_cohort or cross_national type) |
|
|
176
|
+
| Figure generation | `/make-figures` (forest plot of all combinations) |
|
|
177
|
+
|
|
178
|
+
## Example Invocations
|
|
179
|
+
|
|
180
|
+
### Basic: Single DB, Multiple Exposures × Single Outcome
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
/batch-cohort
|
|
184
|
+
|
|
185
|
+
DB: /path/to/knhanes/HN18.csv
|
|
186
|
+
Template: /path/to/validated_analysis.R
|
|
187
|
+
Exposures: [depression, obesity, smoking, heavy_drinking, low_income, low_education]
|
|
188
|
+
Outcome: diabetes
|
|
189
|
+
Mode: full
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Cross-National: Full Matrix
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
/batch-cohort
|
|
196
|
+
|
|
197
|
+
DB Korea: /path/to/knhanes/HN18.csv
|
|
198
|
+
DB US: /path/to/nhanes/
|
|
199
|
+
Template: cross_national
|
|
200
|
+
Exposures: [depression, obesity, smoking]
|
|
201
|
+
Outcomes: [diabetes, hypertension, metabolic_syndrome]
|
|
202
|
+
cross_national: true
|
|
203
|
+
Mode: execute
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### NHIS Cohort: Claims-Based Batch
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
/batch-cohort
|
|
210
|
+
|
|
211
|
+
DB: /path/to/nhis_sample_cohort.csv
|
|
212
|
+
Template: nhis_cohort
|
|
213
|
+
Exposures: [atrial_fibrillation, heart_failure, COPD, CKD]
|
|
214
|
+
Outcomes: [all_cause_mortality, cardiovascular_death, stroke]
|
|
215
|
+
Mode: code_only
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Anti-Hallucination
|
|
219
|
+
|
|
220
|
+
- **Never fabricate variable names, dataset column names, or variable codings.** If a variable mapping is uncertain, output `[VERIFY: variable_name]` and ask the user to confirm against the data dictionary.
|
|
221
|
+
- **Never fabricate statistical results** — no invented p-values, effect sizes, confidence intervals, or sample sizes. All numbers must come from executed code output.
|
|
222
|
+
- **Never generate references from memory.** Use `/search-lit` for all citations.
|
|
223
|
+
- If a function, package, or API does not exist or you are unsure, say so explicitly rather than guessing.
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/usr/bin/env Rscript
|
|
2
|
+
# ==============================================================================
|
|
3
|
+
# KNHANES Survey-Weighted Logistic Regression — Batch Template
|
|
4
|
+
# Combo: {{COMBO_ID}} | {{EXPOSURE_LABEL}} → {{OUTCOME_LABEL}}
|
|
5
|
+
#
|
|
6
|
+
# Slot variables (replaced by batch_template_generator.R):
|
|
7
|
+
# {{EXPOSURE_VAR}}, {{EXPOSURE_LABEL}}, {{EXPOSURE_CODING}}
|
|
8
|
+
# {{OUTCOME_VAR}}, {{OUTCOME_LABEL}}, {{OUTCOME_CODING}}
|
|
9
|
+
# {{RESULTS_DIR}}, {{COMBO_ID}}, {{COVARIATES_REMOVE}}
|
|
10
|
+
#
|
|
11
|
+
# Data: KNHANES single-cycle CSV (e.g., HN18.csv)
|
|
12
|
+
# ==============================================================================
|
|
13
|
+
|
|
14
|
+
suppressPackageStartupMessages({
|
|
15
|
+
library(survey)
|
|
16
|
+
library(dplyr)
|
|
17
|
+
library(tidyr)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
# --- CONFIG (edit these paths for your setup) ---
|
|
21
|
+
DATA_PATH <- "{{DATA_PATH}}" # e.g., /path/to/HN18.csv
|
|
22
|
+
RESULTS_DIR <- "{{RESULTS_DIR}}"
|
|
23
|
+
COMBO_ID <- "{{COMBO_ID}}"
|
|
24
|
+
AGE_MIN <- 20
|
|
25
|
+
AGE_MAX <- Inf
|
|
26
|
+
|
|
27
|
+
# --- Standard Covariates ---
|
|
28
|
+
# Full set; exposure-specific removals applied below
|
|
29
|
+
ALL_COVARIATES <- c("age", "sex_binary", "edu_binary", "income_binary",
|
|
30
|
+
"smoking_3cat", "alcohol_3cat", "obesity_binary", "cvd_binary")
|
|
31
|
+
REMOVE_COVARS <- c({{COVARIATES_REMOVE}})
|
|
32
|
+
COVARIATES <- setdiff(ALL_COVARIATES, REMOVE_COVARS)
|
|
33
|
+
|
|
34
|
+
# --- Load & Clean ---
|
|
35
|
+
raw <- read.csv(DATA_PATH)
|
|
36
|
+
|
|
37
|
+
df <- raw %>%
|
|
38
|
+
filter(age >= AGE_MIN, age <= AGE_MAX) %>%
|
|
39
|
+
mutate(
|
|
40
|
+
# --- Demographics ---
|
|
41
|
+
sex_binary = ifelse(sex == 1, 0, 1), # 0=male, 1=female
|
|
42
|
+
edu_binary = ifelse(edu %in% 1:3, 0, 1), # 0=non-college, 1=college
|
|
43
|
+
income_binary = ifelse(incm %in% 1:3, 0, 1), # 0=bottom80, 1=top20
|
|
44
|
+
|
|
45
|
+
# --- Standard Covariates ---
|
|
46
|
+
smoking_3cat = case_when(
|
|
47
|
+
BS3_1 %in% c(1, 2) ~ "current",
|
|
48
|
+
BS3_1 == 3 ~ "former",
|
|
49
|
+
BS3_1 == 8 ~ "never",
|
|
50
|
+
TRUE ~ NA_character_
|
|
51
|
+
),
|
|
52
|
+
alcohol_3cat = case_when(
|
|
53
|
+
BD1_11 %in% 2:6 ~ "frequent",
|
|
54
|
+
BD1_11 == 1 ~ "occasional",
|
|
55
|
+
BD1_11 == 8 ~ "never",
|
|
56
|
+
TRUE ~ NA_character_
|
|
57
|
+
),
|
|
58
|
+
obesity_binary = ifelse(HE_obe >= 4, 1, 0),
|
|
59
|
+
cvd_binary = ifelse(DI4_dg == 1 | DI5_dg == 1 | DI6_dg == 1, 1, 0),
|
|
60
|
+
|
|
61
|
+
# --- Exposure (SLOT) ---
|
|
62
|
+
exposure = {{EXPOSURE_CODING}},
|
|
63
|
+
|
|
64
|
+
# --- Outcome (SLOT) ---
|
|
65
|
+
outcome = {{OUTCOME_CODING}}
|
|
66
|
+
) %>%
|
|
67
|
+
filter(!is.na(exposure), !is.na(outcome))
|
|
68
|
+
|
|
69
|
+
cat(sprintf("[%s] N after filtering: %d (exposure=1: %d, outcome=1: %d)\n",
|
|
70
|
+
COMBO_ID, nrow(df), sum(df$exposure == 1), sum(df$outcome == 1)))
|
|
71
|
+
|
|
72
|
+
# --- EPV Check ---
|
|
73
|
+
n_events <- min(sum(df$outcome == 1), sum(df$outcome == 0))
|
|
74
|
+
n_params <- length(COVARIATES) + 1 # +1 for exposure
|
|
75
|
+
epv <- n_events / n_params
|
|
76
|
+
if (epv < 10) {
|
|
77
|
+
warning(sprintf("[%s] EPV = %.1f (< 10). Results may be unreliable.", COMBO_ID, epv))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# --- Survey Design ---
|
|
81
|
+
design <- svydesign(
|
|
82
|
+
id = ~psu,
|
|
83
|
+
strata = ~kstrata,
|
|
84
|
+
weights = ~wt_itvex,
|
|
85
|
+
nest = TRUE,
|
|
86
|
+
data = df
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# --- Table 1: Weighted Demographics by Exposure ---
|
|
90
|
+
table1_vars <- c("age", "sex_binary", "edu_binary", "income_binary",
|
|
91
|
+
"smoking_3cat", "alcohol_3cat", "obesity_binary", "cvd_binary", "outcome")
|
|
92
|
+
|
|
93
|
+
table1_rows <- lapply(table1_vars, function(v) {
|
|
94
|
+
tryCatch({
|
|
95
|
+
if (is.numeric(df[[v]])) {
|
|
96
|
+
means <- svyby(as.formula(paste0("~", v)), ~exposure, design, svymean, na.rm = TRUE)
|
|
97
|
+
data.frame(variable = v,
|
|
98
|
+
unexposed_mean = means[means$exposure == 0, v],
|
|
99
|
+
exposed_mean = means[means$exposure == 1, v],
|
|
100
|
+
stringsAsFactors = FALSE)
|
|
101
|
+
} else {
|
|
102
|
+
props <- svyby(as.formula(paste0("~factor(", v, ")")), ~exposure, design, svymean, na.rm = TRUE)
|
|
103
|
+
data.frame(variable = paste0(v, "_", names(props)[-1]),
|
|
104
|
+
unexposed_mean = as.numeric(props[props$exposure == 0, -1]),
|
|
105
|
+
exposed_mean = as.numeric(props[props$exposure == 1, -1]),
|
|
106
|
+
stringsAsFactors = FALSE)
|
|
107
|
+
}
|
|
108
|
+
}, error = function(e) NULL)
|
|
109
|
+
})
|
|
110
|
+
table1 <- do.call(rbind, Filter(Negate(is.null), table1_rows))
|
|
111
|
+
write.csv(table1, file.path(RESULTS_DIR, "table1.csv"), row.names = FALSE)
|
|
112
|
+
|
|
113
|
+
# --- Helper: extract OR + CI + p from svyglm ---
|
|
114
|
+
extract_or <- function(model) {
|
|
115
|
+
or_val <- unname(exp(coef(model)["exposure"]))
|
|
116
|
+
ci_vals <- unname(exp(confint(model))["exposure", ])
|
|
117
|
+
p_val <- unname(summary(model)$coefficients["exposure", "Pr(>|t|)"])
|
|
118
|
+
c(OR = or_val, lower = ci_vals[1], upper = ci_vals[2], p = p_val)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# --- Main Analysis: Sequential Models ---
|
|
122
|
+
results <- list()
|
|
123
|
+
|
|
124
|
+
# Model 1: Unadjusted
|
|
125
|
+
m1 <- svyglm(outcome ~ exposure, design = design, family = quasibinomial())
|
|
126
|
+
results[["Model 1 (unadjusted)"]] <- extract_or(m1)
|
|
127
|
+
|
|
128
|
+
# Model 2: Age + Sex
|
|
129
|
+
m2 <- svyglm(outcome ~ exposure + age + sex_binary, design = design, family = quasibinomial())
|
|
130
|
+
results[["Model 2 (age+sex)"]] <- extract_or(m2)
|
|
131
|
+
|
|
132
|
+
# Model 3: Fully adjusted
|
|
133
|
+
formula_full <- as.formula(paste("outcome ~ exposure +", paste(COVARIATES, collapse = " + ")))
|
|
134
|
+
m3 <- svyglm(formula_full, design = design, family = quasibinomial())
|
|
135
|
+
results[["Model 3 (fully adjusted)"]] <- extract_or(m3)
|
|
136
|
+
|
|
137
|
+
# Save main results
|
|
138
|
+
main_df <- data.frame(
|
|
139
|
+
combo_id = COMBO_ID,
|
|
140
|
+
exposure = "{{EXPOSURE_LABEL}}",
|
|
141
|
+
outcome = "{{OUTCOME_LABEL}}",
|
|
142
|
+
model = names(results),
|
|
143
|
+
N = nrow(df),
|
|
144
|
+
events = sum(df$outcome == 1),
|
|
145
|
+
OR = sapply(results, `[`, "OR"),
|
|
146
|
+
lower = sapply(results, `[`, "lower"),
|
|
147
|
+
upper = sapply(results, `[`, "upper"),
|
|
148
|
+
p_value = sapply(results, `[`, "p"),
|
|
149
|
+
row.names = NULL
|
|
150
|
+
)
|
|
151
|
+
write.csv(main_df, file.path(RESULTS_DIR, "main_results.csv"), row.names = FALSE)
|
|
152
|
+
|
|
153
|
+
# --- Subgroup Analyses (Model 3 within strata) ---
|
|
154
|
+
subgroup_vars <- list(
|
|
155
|
+
sex = list(var = "sex_binary", levels = c(0, 1), labels = c("Male", "Female")),
|
|
156
|
+
age_grp = list(var = "age_group", levels = c("20-39", "40-59", "60+"), labels = NULL),
|
|
157
|
+
edu = list(var = "edu_binary", levels = c(0, 1), labels = c("Non-college", "College")),
|
|
158
|
+
income = list(var = "income_binary", levels = c(0, 1), labels = c("Lower", "Higher"))
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Create age groups
|
|
162
|
+
df$age_group <- cut(df$age, breaks = c(20, 40, 60, Inf), right = FALSE,
|
|
163
|
+
labels = c("20-39", "40-59", "60+"))
|
|
164
|
+
design <- update(design, age_group = df$age_group)
|
|
165
|
+
|
|
166
|
+
subgroup_results <- list()
|
|
167
|
+
for (sg_name in names(subgroup_vars)) {
|
|
168
|
+
sg <- subgroup_vars[[sg_name]]
|
|
169
|
+
for (lev in sg$levels) {
|
|
170
|
+
tryCatch({
|
|
171
|
+
sub_design <- subset(design, get(sg$var) == lev)
|
|
172
|
+
n_sub <- nrow(sub_design$variables)
|
|
173
|
+
n_events_sub <- sum(sub_design$variables$outcome == 1)
|
|
174
|
+
|
|
175
|
+
if (n_sub >= 30 && n_events_sub >= 5) {
|
|
176
|
+
# Reduced model for subgroups (fewer covariates to avoid convergence issues)
|
|
177
|
+
sg_covars <- setdiff(COVARIATES, sg$var)
|
|
178
|
+
sg_formula <- as.formula(paste("outcome ~ exposure +", paste(sg_covars, collapse = " + ")))
|
|
179
|
+
m_sg <- svyglm(sg_formula, design = sub_design, family = quasibinomial())
|
|
180
|
+
r_sg <- extract_or(m_sg)
|
|
181
|
+
|
|
182
|
+
subgroup_results[[length(subgroup_results) + 1]] <- data.frame(
|
|
183
|
+
combo_id = COMBO_ID,
|
|
184
|
+
exposure = "{{EXPOSURE_LABEL}}",
|
|
185
|
+
outcome = "{{OUTCOME_LABEL}}",
|
|
186
|
+
subgroup = sg_name,
|
|
187
|
+
level = as.character(lev),
|
|
188
|
+
N = n_sub,
|
|
189
|
+
events = n_events_sub,
|
|
190
|
+
OR = r_sg["OR"],
|
|
191
|
+
lower = r_sg["lower"],
|
|
192
|
+
upper = r_sg["upper"],
|
|
193
|
+
p_value = r_sg["p"],
|
|
194
|
+
row.names = NULL
|
|
195
|
+
)
|
|
196
|
+
}
|
|
197
|
+
}, error = function(e) {
|
|
198
|
+
message(sprintf("[%s] Subgroup %s=%s failed: %s", COMBO_ID, sg_name, lev, e$message))
|
|
199
|
+
})
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (length(subgroup_results) > 0) {
|
|
204
|
+
subgroup_df <- do.call(rbind, subgroup_results)
|
|
205
|
+
write.csv(subgroup_df, file.path(RESULTS_DIR, "subgroup_results.csv"), row.names = FALSE)
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
cat(sprintf("[%s] Complete. Fully adjusted wOR: %.2f (%.2f–%.2f), p=%.3f\n",
|
|
209
|
+
COMBO_ID,
|
|
210
|
+
main_df$OR[3], main_df$lower[3], main_df$upper[3], main_df$p_value[3]))
|