From extracted studies to model parameters: PTX3, CLEC7A, TLR4, CD209, IL10 and IFNG

Published

November 11, 2026

Code
source("_setup.R")
studies <- read.csv("output/ptx3_study_effects.csv")
pooled  <- read.csv("output/ptx3_h2_pooled.csv")
cross   <- read.csv("output/ptx3_snp_crosscheck.csv")
donor   <- read.csv("output/ptx3_donor_effects.csv")
rows    <- read.csv("output/ptx3_row_effects.csv")
vlog    <- read.csv("output/ptx3_verification_log.csv")
s035    <- read.csv("output/s035_direction_check.csv")
s029    <- read.csv("output/s029_genotype_frequency_check.csv")
clec    <- list(study = read.csv("output/clec7a_study_effects.csv"), pooled = read.csv("output/clec7a_pooled.csv"), rows = read.csv("output/clec7a_row_effects.csv"))
tlr4    <- list(study = read.csv("output/tlr4_study_effects.csv"), pooled = read.csv("output/tlr4_pooled.csv"), cross = read.csv("output/tlr4_snp_crosscheck.csv"))
cd209   <- list(study = read.csv("output/cd209_study_effects.csv"), pooled = read.csv("output/cd209_pooled.csv"), cross = read.csv("output/cd209_snp_crosscheck.csv"), rows = read.csv("output/cd209_row_effects.csv"))
il10    <- list(study = read.csv("output/il10_study_effects.csv"), pooled = read.csv("output/il10_pooled.csv"))
ifng    <- list(study = read.csv("output/ifng_study_effects.csv"), pooled = read.csv("output/ifng_pooled.csv"))
strand  <- read.csv("data/rs7309123_strand_resolution.csv")
clec2   <- read.csv("output/clec7a_second_pooled.csv")
study_label <- function(d) paste0(sub(",.*", "", d$first_author), " ", d$year)
WarningProvisional

The extraction rows are round 1 plus the recorded corrections. Two papers (Herrero-Sanchez 2018 and Brunel 2018) were read against the extraction by the assistant. The human round-2 check is reported to have confirmed the extraction against the source PDFs, but its record is not in the repository. Most mapping rules and the priors are proposals, set out in addenda 7 to 9 of the decision record. Treat every number on this page as provisional.

What “h2” means

PTX3 has three loci in strong linkage (rs2305619, rs3816527, rs1840680). In the phased 1000 Genomes European data the common haplotypes are G-A-G (54%), A-C-A (40%) and A-A-A (6%), with alleles in that locus order.

  • h2 is the chromosome class that carries the A allele at rs2305619: A-C-A, A-A-A and the very rare A-A-G, 45.6% in 1000G EUR and 48.2% in gnomAD NFE. h1 is G-A-G. The model term is an additive per-copy effect of h2 in the recipient.
  • rs1840680 A is the same class (r² = 0.996), so it is an interchangeable tag.
  • rs3816527 C is not interchangeable. It marks only A-C-A, about 87% of h2, so evidence reported on it is mapped to h2 through the haplotype structure and used as a cross-check.

How each study is converted

Studies report PTX3 in different ways: dominant or recessive contrasts, allelic odds ratios, or genotype counts, with the contrast sometimes written in both directions. Each one is converted to a single scale, the log odds ratio per h2 copy, by finding the effect that a haplotype model would need to produce the study’s contrast. The model is additive on the log-odds scale, uses Hardy-Weinberg haplotype pairs and case-control sampling, and the standard error follows by the delta method. The direction of each contrast is read from the comparison text, including which side is the reference.

One effect per study

Code
studies |>
  transmute(Study = paste0(sub(",.*", "", first_author), " ", year), `Evidence used` = paste(tier, model, sep = ", "),
            `Log OR as reported` = y, `Per-copy h2 effect` = beta, SE = se_beta, `OR per h2 copy` = or_per_h2_copy,
            Note = flag) |>
  gt() |>
  fmt_number(c(`Log OR as reported`, `Per-copy h2 effect`, SE, `OR per h2 copy`), decimals = 2)
Table 1: Primary analysis: recipient genotype, odds-ratio scale, whole-cohort analyses, without Herrero-Sanchez 2018.
Study Evidence used Log OR as reported Per-copy h2 effect SE OR per h2 copy Note
Tang 2020 estimate, dominant 0.49 0.36 0.27 1.44
Brunel 2018 counts_2x2, recessive 0.80 0.63 0.35 1.87 effect allele inferred as the European minor allele (A)
Schnetzke 2024 estimate, dominant 0.05 0.44 0.26 1.55 cohorts disagree (Q = 5.5 on 1 df)
Kalkanci 2020 counts_2x3, genotypic_3level 0.05 −0.05 0.34 0.96 additive trend mapped as an allelic effect (approximation)
Tanpaibule 2020 estimate, dominant 0.23 −0.16 0.57 0.85
Code
pr <- pooled[1, ]
d <- bind_rows(
  studies |> transmute(label = paste0(sub(",.*", "", first_author), " ", year), est = beta, lo = beta - 1.645 * se_beta, hi = beta + 1.645 * se_beta, kind = "Study"),
  tibble(label = "Pooled (primary)", est = pr$mu, lo = pr$mu_lo, hi = pr$mu_hi, kind = "Pooled")
)
d$label <- factor(d$label, levels = rev(d$label))
ggplot(d, aes(est, label, shape = kind)) +
  geom_vline(xintercept = 0, linetype = "dashed", colour = jama_cols[["grey"]]) +
  geom_pointrange(aes(xmin = lo, xmax = hi, colour = kind)) +
  scale_shape_manual(values = c(Study = 16, Pooled = 18)) +
  scale_colour_manual(values = c(Study = jama_cols[["blue"]], Pooled = jama_cols[["navy"]])) +
  labs(x = "Log odds ratio per h2 copy", y = NULL, shape = NULL) +
  theme_jama(grid = "x") + theme(legend.position = "none")
Figure 1: Per-copy h2 effect for each study (90% interval) and the pooled estimate with its 90% credible interval.

Pooled effect

Code
pooled |>
  transmute(Analysis = scenario, Studies = k, `Log OR` = mu, `5%` = mu_lo, `95%` = mu_hi, OR = or, `OR 5%` = or_lo, `OR 95%` = or_hi,
            tau = tau, `P(effect < 0)` = prob_below_zero) |>
  gt() |>
  fmt_number(c(`Log OR`, `5%`, `95%`, OR, `OR 5%`, `OR 95%`, tau), decimals = 2) |>
  fmt_percent(`P(effect < 0)`, decimals = 0)
Table 2: Bayesian random-effects pooling, with sensitivity analyses. mu ~ N(0, 1) and tau ~ half-normal(0.5) on the log-odds scale.
Analysis Studies Log OR 5% 95% OR OR 5% OR 95% tau P(effect < 0)
primary: recipient, OR scale, whole cohort, without Herrero-Sanchez 5 0.30 −0.01 0.59 1.35 0.99 1.81 0.17 5%
with Herrero-Sanchez 2018 (S035), detection endpoint 6 0.34 0.07 0.59 1.40 1.08 1.80 0.14 2%
with Herrero-Sanchez 2018 (S035), invasive aspergillosis endpoint 6 0.37 0.08 0.67 1.45 1.08 1.96 0.18 2%
without Brunel 2018 (S029) 4 0.23 −0.14 0.58 1.26 0.87 1.79 0.19 13%
European-ancestry cohorts only 3 0.33 −0.09 0.75 1.39 0.91 2.11 0.23 9%
rs3816527 as the tag SNP, mapped to h2 4 0.36 0.00 0.71 1.44 1.00 2.04 0.20 5%
with hazard-ratio studies 5 0.30 0.00 0.59 1.35 1.00 1.81 0.18 5%

The primary estimate is an odds ratio of 1.35 per h2 copy, with a 90% interval of 0.99 to 1.81. The interval just reaches 1, and the prediction interval for a new study is wide (an odds ratio of 0.81 to 2.21), so the evidence is weak. Herrero-Sanchez 2018 first appeared to point the other way; reading the paper showed that the extraction followed a reference label that is reversed in the source, and corrected it is positive (see the next section). Adding it raises the estimate and tightens the interval, and dropping Brunel 2018 lowers the estimate and widens it.

Checking rows against their sources

Two studies drive most of the doubt about direction, so they were read first.

Code
vlog |>
  transmute(Study = study, Item = item, `The source says` = source_says, Verdict = verdict, Consequence = consequence) |>
  gt() |>
  tab_options(table.font.size = "small")
Table 3: What was checked, what the source says, and what follows. Herrero-Sanchez 2018 was read as full text; Brunel 2018 from a summary of the article page, so its figures are not verbatim.
Study Item The source says Verdict Consequence
S035 extracted odds ratios and intervals, Table 3, all three SNPs and models Table 3 prints the same ORs and CIs as the extraction (rs2305619 dominant 1.83, 0.89 to 3.76; recessive 1.55; rs3816527 dominant 1.74, recessive 2.02; rs1840680 dominant 1.94, recessive 1.76) confirmed none
S035 reference-group label on the odds ratios, Tables 3 to 8 The reference group carries 1.00 but the printed OR is for that group against the others. The group counts show it for every SNP and model checked, and the text calls AA (rs2305619, rs1840680) and CC (rs3816527) the risk genotypes corrected the 30 dominant and recessive rows are corrected; the S035 effect is positive (A allele raises risk), in line with the other studies, not the opposite
S035 endpoint of the extracted primary rows (Table 3) Detection of Candida and/or Aspergillus, which includes colonisation (Table 3); 198 patients consistent with D3b S035 stays out of the primary analysis
S035 invasive aspergillosis endpoint (Table 5) Invasive aspergillosis in the whole cohort: 12 patients with EORTC/MSG invasive disease against 186 without; adjusted for sex, age and malignancy available as a sensitivity analysis a separate sensitivity analysis uses the Table 5 rows
S035 genotype source and covariates Samples taken at diagnosis, before HSCT in transplant patients; adjusted for sex, age, haematological malignancy confirmed S035 is a recipient-genotype study
S035 rs1840680 recessive interval in Table 3 The paper prints 1.76 (0.92 to 1.76): the upper limit equals the estimate, a printing error in the source source error, kept as printed that row is excluded by the interval check
S035 CLEC7A results (supplementary tables) Not read: they are in the supplementary file, which was not retrieved not verified S035 CLEC7A rows stay unverified
S029 design, size and outcome 185 patients and 212 chemotherapy courses (2007 to 2017); 26 probable or proven invasive mould infections (16 probable, 10 proven), all moulds; 6-month cumulative incidence 14% confirmed none
S029 minor allele frequencies and linkage Minor allele frequencies 0.44 (rs3816527) and 0.48 (rs2305619); linkage R = 0.78; both in Hardy-Weinberg equilibrium. These fit A and C as the minor alleles supports the inferred alleles, weakly for rs2305619 Brunel's inferred effect allele (A at rs2305619) is plausible but not proven
S029 per-SNP genotype counts The main text prints none: per-SNP results are in Online Supplementary Figure S2, an image not verifiable from the text Brunel's per-SNP counts cannot be checked against the text
S029 combined exposure and hazard ratio in the non-neutropenic stratum Exposure is two copies of the minor allele of rs2305619 and/or rs3816527; adjusted HR 5.06 (1.68 to 15.2) without pre-existing neutropenia confirmed, but it cannot be mapped to one SNP none for the per-SNP analysis
S029 extracted rs3816527 homozygote group against Hardy-Weinberg expectations With a minor allele frequency of 0.44, CC homozygotes should be about 19% of courses; the extracted group is about 30%, which fits AA homozygotes (about 31%) and not CC (z about 3.8). For rs2305619 the minor and major homozygote shares (23% and 27%) are too close to tell apart unresolved: the group may not be the minor homozygotes Brunel's rs3816527 counts may be the wrong homozygote group; a sensitivity analysis drops Brunel
S029 genotype source Not stated in the text. Samples from allo-HSCT relapse patients were used only if taken after engraftment, when blood DNA may be the donor's unresolved Brunel is treated as a recipient study, flagged

Herrero-Sanchez 2018. In every table the reference group is labelled 1.00, but the printed odds ratio belongs to that group against the others. The genotype counts show it for every SNP and model checked:

Code
s035 |>
  transmute(Table = table, SNP = snp, Model = model, Printed = printed_or, `Crude, reading A` = crude_ref_vs_other,
            `Distance, A` = distance_if_reference_numerator, `Distance, B` = distance_if_other_numerator,
            Decisive = ifelse(decisive, "yes", "no")) |>
  gt() |>
  fmt_number(c(Printed, `Crude, reading A`, `Distance, A`, `Distance, B`), decimals = 2)
Table 4: Herrero-Sanchez 2018: the printed odds ratio against the crude odds ratio from the genotype counts, in each direction. Reading A: the reference-labelled group is the numerator. Reading B: the other group is.
Table SNP Model Printed Crude, reading A Distance, A Distance, B Decisive
Table 3 rs2305619 dominant 1.83 1.76 0.04 1.17 yes
Table 3 rs2305619 recessive 1.55 1.50 0.03 0.84 yes
Table 3 rs3816527 dominant 1.74 1.70 0.02 1.09 yes
Table 3 rs3816527 recessive 2.02 2.03 0.00 1.41 yes
Table 3 rs1840680 dominant 1.94 1.87 0.04 1.29 yes
Table 3 rs1840680 recessive 1.76 1.70 0.03 1.10 yes
Table 4 rs2305619 dominant 3.28 3.12 0.05 2.32 yes
Table 4 rs2305619 recessive 2.03 1.74 0.16 1.26 yes
Table 4 rs3816527 dominant 2.55 2.58 0.01 1.88 yes
Table 4 rs3816527 recessive 1.97 1.67 0.16 1.19 yes
Table 4 rs1840680 dominant 3.98 3.75 0.06 2.70 yes
Table 4 rs1840680 recessive 2.24 1.89 0.17 1.44 yes
Table 5 rs2305619 dominant 4.20 4.31 0.03 2.90 yes
Table 5 rs2305619 recessive 1.27 1.10 0.14 0.34 no
Table 5 rs3816527 dominant 5.10 5.64 0.10 3.36 yes
Table 5 rs3816527 recessive 1.63 1.43 0.13 0.85 yes
Table 5 rs1840680 dominant 4.15 4.17 0.00 2.85 yes
Table 5 rs1840680 recessive 1.36 1.20 0.13 0.49 no

All 18 comparisons favour reading A (16 decisively, 2 too close to 1 to tell). The extracted study therefore has a positive per-copy h2 effect, like the others.

Brunel 2018. The extracted counts for the group labelled “homozygous for the minor allele” can be compared with what Hardy-Weinberg predicts from the paper’s own minor allele frequencies (0.48 for rs2305619, 0.44 for rs3816527):

Code
s029 |>
  transmute(SNP = rsid, Analysis = analysis, Observed = observed, `Expected, minor homozygotes` = expected_minor_homozygotes,
            `Expected, major homozygotes` = expected_major_homozygotes, `z, minor` = z_minor_homozygotes, `z, major` = z_major_homozygotes) |>
  gt() |>
  fmt_number(2:7, decimals = 2)
Table 5: Brunel 2018: the share of courses in the extracted homozygote group, against the minor-allele and major-allele homozygote shares that Hardy-Weinberg predicts.
SNP Analysis Observed Expected, minor homozygotes Expected, major homozygotes z, minor z, major
rs2305619 All episodes (N=212) 0.27 0.23 0.27 1.33 −0.05
rs3816527 All episodes (N=212) 0.30 0.19 0.31 3.99 −0.33
rs2305619 No neutropenia at presentation (N=133) 0.25 0.23 0.27 0.49 −0.58
rs3816527 No neutropenia at presentation (N=133) 0.29 0.19 0.31 2.68 −0.66
rs2305619 Neutropenia at presentation (N=79) 0.30 0.23 0.27 1.55 0.67
rs3816527 Neutropenia at presentation (N=79) 0.33 0.19 0.31 3.05 0.30

For rs3816527 the extracted group fits the major-allele homozygotes and not the minor ones (z about 3 to 4), in every stratum. So the group may not be the one the paper describes, and the sign of this study’s effect is not secure. The per-SNP counts themselves are only in a supplementary figure.

Code
tab <- table(Reason = ifelse(is.na(rows$beta), sub(";.*", "", rows$flag), "mapped"))
tibble(Reason = names(tab), Rows = as.integer(tab)) |> arrange(desc(Rows)) |> gt()
Table 6: Why usable PTX3 rows do not map to a per-copy h2 effect.
Reason Rows
mapped 130
implied effect not monotone in beta 18
more than two groups 15
estimate not strictly inside its interval 1

Does the h2 definition hold?

If h2 explains the signal, mapping a study through rs3816527 instead of the h2 tag SNP should give about the same per-copy effect.

Code
cross |>
  transmute(Study = study_id, `Through the h2 tag SNP` = beta_tag, `Through rs3816527` = beta_rs3816527, Difference = difference) |>
  gt() |>
  fmt_number(2:4, decimals = 2)
Table 7: The same study mapped through the h2 tag SNP and through rs3816527.
Study Through the h2 tag SNP Through rs3816527 Difference
S026 0.36 0.51 0.15
S029 0.63 0.76 0.14
S035 0.47 0.47 0.00
S045 0.44 0.36 −0.08
S056 −0.05 −0.08 −0.04

The two agree to within about 0.15 for every study, which supports defining h2 by the rs2305619 and rs1840680 A alleles.

Donor genotype

Donor genotype is the pre-specified secondary analysis (allogeneic HSCT only). Only one study reports it, so it is described and not pooled.

Code
donor |>
  transmute(Study = paste0(sub(",.*", "", first_author), " ", year), Evidence = paste(tier, model, measure, sep = ", "),
            `Per-copy h2 effect` = beta, SE = se_beta, `OR per h2 copy` = or_per_h2_copy) |>
  gt() |>
  fmt_number(3:5, decimals = 2)
Table 8: Donor-genotype evidence, mapped to a per-copy h2 effect.
Study Evidence Per-copy h2 effect SE OR per h2 copy
Cunha 2014 estimate, recessive, OR 0.36 0.41 1.44
Fisher 2017 estimate, recessive, HR −0.22 0.08 0.80

CLEC7A: the Y238X haplotype

Y238X (the C allele of rs16910526 on the forward strand) sits only on the C-G haplotype of rs16910526 and rs7309123, which is 7.7% of chromosomes in gnomAD NFE (A-G is 34.9% and A-C 57.4%). The term is the per-copy effect of that haplotype. Studies that write the allele as G are on the opposite strand, and are complemented.

Code
clec$study |>
  transmute(Study = paste0(sub(",.*", "", first_author), " ", year), `Evidence used` = paste(tier, model, sep = ", "),
            `Log OR as reported` = y, `Per-copy effect` = beta, SE = se_beta, `OR per copy` = or_per_copy) |>
  gt() |>
  fmt_number(c(`Log OR as reported`, `Per-copy effect`, SE, `OR per copy`), decimals = 2)
Table 9: CLEC7A, primary analysis: one effect per study, per copy of the Y238X haplotype.
Study Evidence used Log OR as reported Per-copy effect SE OR per copy
Ceesay 2016 counts_2x3, genotypic_3level 0.03 0.03 0.68 1.03
Kalkanci 2020 counts_2x3, genotypic_3level −0.89 −0.86 0.73 0.42
Sainz 2012 estimate, genotypic_3level 0.13 0.13 0.51 1.14
Fischer 2016 estimate, carrier −0.36 −0.36 0.64 0.70
Code
clec$pooled |>
  transmute(Analysis = scenario, Studies = k, OR = or, `OR 5%` = or_lo, `OR 95%` = or_hi, tau = tau) |>
  gt() |>
  fmt_number(c(OR, `OR 5%`, `OR 95%`, tau), decimals = 2)
Table 10: CLEC7A pooled effect.
Analysis Studies OR OR 5% OR 95% tau
primary: recipient, OR scale, whole cohort, without Herrero-Sanchez 4 0.84 0.48 1.48 0.25
with Herrero-Sanchez 2018 (S035) 4 0.84 0.48 1.46 0.25
with hazard-ratio studies 5 1.23 0.70 1.77 0.32
European-ancestry cohorts only 4 0.83 0.49 1.47 0.24
donor genotype (secondary analysis) 1 0.70 0.19 2.53 0.33

Among the small odds-ratio studies Y238X is null. The largest study (Fisher 2017, 483 cases) reports hazard ratios above 1, and including it moves the pooled effect up. The second CLEC7A effect is the per-copy effect of the A-G haplotype, the G allele of rs7309123 on the non-Y238X background (A-C is the reference). rs7309123 is a C/G palindrome, so the strand each study used had to be determined from its control frequencies and the papers themselves; the evidence for each study is in data/rs7309123_strand_resolution.csv and in addendum 16 of the decision record. Studies are graded A to D, and only grades A and B (resolved with at least low-to-medium confidence; the full texts of Kalkanci 2020 and Chen 2019 settled their strands, addendum 19) enter the primary estimate.

Code
strand |>
  transmute(Study = paste0(first_author, " ", year), Ancestry = ancestry, `Labelled allele frequency` = observed_frequency_of_labelled_allele,
            `log10 LR, forward vs opposite` = log10_likelihood_ratio_forward_vs_opposite, Conclusion = strand_conclusion, Grade = grade) |>
  gt() |>
  fmt_number(c(`Labelled allele frequency`, `log10 LR, forward vs opposite`), decimals = 2) |>
  sub_missing(missing_text = "")
Table 11: Strand of rs7309123 in each study that reports it. The likelihood ratio compares the study’s control frequency of the labelled allele with the forward-strand and opposite-strand reference frequencies.
Study Ancestry Labelled allele frequency log10 LR, forward vs opposite Conclusion Grade
Fisher 2017 European 0.43
same_as_forward A
Schnetzke 2024 European 0.46 6.71 same_as_forward A
Tanpaibule 2020 Thai 0.83 250.35 same_as_forward A
Sainz 2012 European (Spanish) 0.34 10.06 same_as_forward B
Fischer 2016 European (Jena AML cohort) 0.48 1.55 same_as_forward C
Fischer 2015 European (Jena AML cohort)

same_as_forward C
White 2018 European (Welsh)

same_as_forward C
Kalkanci 2020 Turkish 0.27 3.87 same_as_forward A
Chen 2019 Chinese Han 0.20 132.16 same_as_forward A
Zhao 2022 Chinese Han

undetermined D
Code
clec2 |>
  transmute(Analysis = scenario, Studies = k, OR = or, `OR 5%` = or_lo, `OR 95%` = or_hi, tau = tau) |>
  gt() |>
  fmt_number(c(OR, `OR 5%`, `OR 95%`, tau), decimals = 2)
Table 12: The second CLEC7A parameter (OR per A-G copy), with Y238X held at its pooled effect. Non-European studies are left out of the primary analysis because the European haplotype frequencies do not describe them.
Analysis Studies OR OR 5% OR 95% tau
primary: strand resolved (grades A and B), European, odds ratios 3 1.86 1.26 2.63 0.17
adding the non-European strand-resolved studies (S077 Thai, S074 Chinese Han), with East Asian haplotype frequencies 5 1.28 0.79 1.95 0.49
adding hazard ratios (S080) 3 1.86 1.25 2.68 0.17
adding the Jena cohort (grade C) 4 1.92 1.43 2.57 0.14
all studies, unresolved ones taken as forward 6 1.40 0.92 2.03 0.46
unresolved studies taken as the opposite strand 6 1.39 0.91 2.03 0.46
East Asian strand-resolved studies only (S077, S074), with East Asian haplotype frequencies 2 0.62 0.35 1.15 0.26
non-European studies with the European haplotype frequencies (not valid, for comparison) 5 1.36 0.84 2.08 0.46

The primary estimate rests on three studies (Schnetzke 2024, Kalkanci 2020 and Sainz 2012) and is an odds ratio of 1.86 per A-G copy, with a 90% interval from 1.26 to 2.63. The interval excludes 1 in every analysis. Adding the Jena cohort, whose strand is only weakly resolved, gives 1.92, and taking every study as forward strand gives 1.40. The row that adds the non-European studies is not a valid estimate (their contrasts are mapped through European haplotype frequencies) and is shown only to document why they are excluded.

TLR4: the G-T haplotype

The term is the G-T haplotype of rs4986790 (G) and rs4986791 (T), 6.1% of chromosomes in gnomAD NFE. No cohort has minor homozygotes, so every study enters as carriers against non-carriers, with 0.5 added to a zero cell (decision D3c).

Code
tlr4$study |>
  transmute(Study = paste0(sub(",.*", "", first_author), " ", year), SNP = rsid, `Log OR as reported` = y, `Per-copy effect` = beta,
            SE = se_beta, `OR per copy` = or_per_copy) |>
  gt() |>
  fmt_number(c(`Log OR as reported`, `Per-copy effect`, SE, `OR per copy`), decimals = 2)
Table 13: TLR4, primary analysis: one effect per study, per copy of the G-T haplotype.
Study SNP Log OR as reported Per-copy effect SE OR per copy
Ceesay 2016 rs4986790 0.64 0.61 0.73 1.85
Kalkanci 2020 rs4986790 0.08 0.08 0.63 1.08
Grube 2013 rs4986790 0.90 0.86 0.55 2.36
Tanpaibule 2020 rs4986790 −1.00 −0.99 1.48 0.37
Code
tlr4$pooled |>
  transmute(Analysis = scenario, Studies = k, OR = or, `OR 5%` = or_lo, `OR 95%` = or_hi, tau = tau) |>
  gt() |>
  fmt_number(c(OR, `OR 5%`, `OR 95%`, tau), decimals = 2)
Table 14: TLR4 pooled effect.
Analysis Studies OR OR 5% OR 95% tau
primary: recipient, OR scale, whole cohort, without Herrero-Sanchez 4 1.44 0.76 2.69 0.27
with Herrero-Sanchez 2018 (S035) 4 1.47 0.78 2.70 0.27
with hazard-ratio studies 4 1.46 0.77 2.70 0.27
European-ancestry cohorts only 3 1.57 0.81 3.04 0.27
second SNP as the tag, mapped to the risk class 3 0.97 0.47 2.00 0.31
donor genotype (secondary analysis) 2 1.24 0.46 3.00 0.36
with de Boer 2011 (S061, genotype source unstated, treated as recipient) 5 1.78 1.02 3.02 0.27

The effect is positive but uncertain. The two SNPs disagree within a large sampling error, which is expected from carrier counts this small. de Boer 2011 analysed donors and recipients and the extraction does not say which genotype its rows use, so it is left out of the primary analysis; treating it as a recipient study raises the estimate. Tanpaibule’s allele is carried by none of its 33 cases against 11 of 295 controls, so its estimate rests on the continuity correction.

CD209: G at rs4804800

The two CD209 SNPs (rs4804800 and rs7248637, r² = 0.41) give four haplotypes in gnomAD NFE: G-A 7.8%, A-A 2.6%, G-G 4.7% and A-G 84.9%. The term is the per-copy effect of the chromosome class that carries G at rs4804800 (G-A and G-G, 12.5%). rs4804800 rows map to it directly. rs7248637 rows (the A allele) map through the haplotype structure and are used where a study has no rs4804800 row. A second CD209 parameter is not estimated.

Code
cd209$study |>
  transmute(Study = study_label(cd209$study), SNP = rsid, `Evidence used` = paste(tier, model, sep = ", "), `Log OR as reported` = y,
            `Per-copy effect` = beta, SE = se_beta, `OR per copy` = or_per_copy) |>
  gt() |>
  fmt_number(c(`Log OR as reported`, `Per-copy effect`, SE, `OR per copy`), decimals = 2)
Table 15: CD209, primary analysis: one effect per study, per copy of the rs4804800 G class. Hazard-ratio studies are a sensitivity analysis because three odds-ratio studies meet the threshold.
Study SNP Evidence used Log OR as reported Per-copy effect SE OR per copy
Schnetzke 2024 rs4804800 estimate, dominant 0.66 0.60 0.33 1.83
Sainz 2012 rs4804800 estimate, additive_per_allele 0.83 0.83 0.33 2.29
Tanpaibule 2020 rs4804800 estimate, dominant 0.42 0.39 0.39 1.47
Code
cd209$pooled |>
  transmute(Analysis = scenario, Studies = k, OR = or, `OR 5%` = or_lo, `OR 95%` = or_hi, tau = tau) |>
  gt() |>
  fmt_number(c(OR, `OR 5%`, `OR 95%`, tau), decimals = 2)
Table 16: CD209 pooled effect.
Analysis Studies OR OR 5% OR 95% tau
primary: recipient, OR scale, whole cohort, without Herrero-Sanchez 3 1.80 1.14 2.73 0.21
with Herrero-Sanchez 2018 (S035) 3 1.79 1.15 2.66 0.20
with hazard-ratio studies 4 1.45 0.85 2.22 0.37
European-ancestry cohorts only 2 1.91 1.09 3.19 0.24
second SNP as the tag, mapped to the risk class 2 2.11 1.06 3.92 0.26

The effect is positive in all three studies. The two studies that also report rs7248637 agree with their rs4804800 effect (differences of 0.21 and 0.07 on the log scale), which supports mapping the rs7248637 evidence to the same class. Adding Fisher 2017 (hazard ratios, rs7248637) lowers the pooled odds ratio to 1.45, with an interval that includes 1. Sainz 2011’s two rows cannot be mapped: an allele is missing and the comparison has more than two groups.

IL10 and IFNG: dropped from the panel

IL10 rs1800896 and IFNG rs2069705 are single SNPs. The risk allele is the forward-strand allele that most studies report as their effect allele (IL10 C, reported as G; IFNG G, reported as C), and a study that reports the other allele is mapped to the same class with the sign reversed. Both were mapped as optional terms, then dropped from the panel on 19 October 2026 (addendum 10) because the evidence is too thin to estimate an effect.

Code
bind_rows(
  il10$study |> mutate(Term = "IL10 rs1800896 C", Study = study_label(il10$study)),
  ifng$study |> mutate(Term = "IFNG rs2069705 G", Study = study_label(ifng$study))
) |>
  transmute(Term, Study, `Evidence used` = paste(tier, model, measure, sep = ", "), `Per-copy effect` = beta, SE = se_beta, `OR per copy` = or_per_copy) |>
  gt() |>
  fmt_number(c(`Per-copy effect`, SE, `OR per copy`), decimals = 2)
Table 17: IL10 and IFNG: odds-ratio evidence has fewer than three studies, so hazard-ratio studies were added (the fallback rule); the pooled value is mostly the prior.
Term Study Evidence used Per-copy effect SE OR per copy
IL10 rs1800896 C Tanpaibule 2020 estimate, dominant, OR 1.14 0.31 3.14
IFNG rs2069705 G Ceesay 2016 counts_2x3, genotypic_3level, none_reported 0.65 0.71 1.92
IFNG rs2069705 G Lupiañez 2015 estimate, dominant, OR −0.39 0.19 0.67
Code
bind_rows(il10$pooled |> mutate(Term = "IL10"), ifng$pooled |> mutate(Term = "IFNG")) |>
  transmute(Term, Analysis = scenario, Studies = k, OR = or, `OR 5%` = or_lo, `OR 95%` = or_hi, tau = tau) |>
  gt() |>
  fmt_number(c(OR, `OR 5%`, `OR 95%`, tau), decimals = 2)
Table 18: IL10 and IFNG pooled effect, first row of each term is the primary (fallback) analysis.
Term Analysis Studies OR OR 5% OR 95% tau
IL10 primary (fallback): hazard ratios included, odds-ratio evidence has 1 of 3 studies needed 1 2.59 1.01 5.02 0.33
IL10 with Herrero-Sanchez 2018 (S035) 1 2.55 1.04 5.07 0.34
IL10 with hazard-ratio studies 1 2.53 1.00 5.11 0.33
IL10 with de Boer 2011 (S061, genotype source unstated, treated as recipient) 2 1.80 0.95 3.20 0.42
IFNG primary (fallback): hazard ratios included, odds-ratio evidence has 2 of 3 studies needed 2 0.82 0.49 1.69 0.33
IFNG with Herrero-Sanchez 2018 (S035) 2 0.82 0.49 1.70 0.33
IFNG with hazard-ratio studies 2 0.82 0.48 1.70 0.34
IFNG European-ancestry cohorts only 2 0.82 0.48 1.67 0.34
IFNG donor genotype (secondary analysis) 1 0.71 0.28 1.88 0.32

IL10 rests on one study (Tanpaibule 2020, a dominant odds ratio of about 5), so its pooled value is that study shrunk by the prior; adding de Boer 2011, whose genotype source is unstated, gives two studies. The two IFNG studies disagree in direction, and the hazard-ratio fallback adds nothing because Fisher’s IFNG rows are donor genotype only. Putting either term back would be a sensitivity analysis.

Limits

  • The rows are unverified except where stated above, and the checks so far are the assistant’s, not the human round-2 check.
  • Brunel 2018 states “the minor allele”, so its effect allele is inferred from European frequencies, and the frequency check above casts doubt on it.
  • The Chinese and Thai cohorts use European haplotype frequencies.
  • Three to five studies per term is few. The priors on the pooled effect and on tau are proposals.
  • Open questions from addendum 8 that the human checks did not settle: whether to use Herrero-Sanchez’s invasive aspergillosis rows and whether to keep Brunel in the primary analysis. The rs7309123 strand is resolved with some confidence for six of the ten studies and weakly for three more; only Zhao 2022 is undetermined (addenda 16 and 19). Hazard-ratio studies join a term’s primary analysis only when it has fewer than three odds-ratio studies (addendum 9).