An agnostic study of associations between ABO and RhD blood group and phenome-wide disease risk

  1. Hematology Department, Karolinska University Hospital
    StockholmSweden
  2. Department of Medicine Solna, Clinical Epidemiology Division, Karolinska Institutet
    StockholmSweden
  3. Department of Medical Epidemiology and Biostatistics, Karolinska Institutet
    StockholmSweden
  4. Division of Hematology and Transfusion Medicine, Department of Laboratory Medicine, Lund University & Department of Clinical Immunology and Transfusion Medicine, Office of Medical Services, Region Skåne
    LundSweden
  5. Cardiology Department, Södersjukhuset
    StockholmSweden

Abstract

Background: There are multiple known associations between the ABO and RhD blood groups and disease. No systematic population-based studies elucidating associations between a large number of disease categories and blood group have been conducted.

Methods: Using SCANDAT3-S, a comprehensive nationwide blood donation-transfusion database, we modeled outcomes for 1217 disease categories including 70 million person-years of follow-up, accruing from 5.1 million individuals.

Results: We discovered 49 and 1 associations between a disease and ABO and RhD blood groups, respectively, after adjustment for multiple testing. We identified new associations such as a decreased risk of kidney stones and blood group B as compared to blood group O. We also expanded previous knowledge on other associations such as pregnancy-induced hypertension and blood groups A and AB as compared to blood group O and RhD positive as compared to negative.

Conclusions: Our findings generate strong further support for previously known associations, but also indicate new interesting relations.

Funding: Swedish Research Council.

Introduction

The blood group antigens of the ABO and RhD systems play a pivotal role in transfusion medicine because of their role in the safe administration of blood transfusions. In addition, these cell surface antigens have been demonstrated to have direct effects on the susceptibility for several diseases 9Franchini et al.201223Stowell and Stowell201924Stowell and Stowell2019. One of the first such studies was published in 1962, demonstrating a relationship between the ABO system and ischemic heart disease 3Bronte-Stewart et al.1962. Multiple subsequent studies have revealed associations with a range of diseases, with a prominent example being a decreased risk of thromboembolic events and increased risks of some hemorrhagic events in individuals with blood group O 9Franchini et al.20128Edgren et al.201027Vasan et al.2016. The difference in thrombotic and hemorrhagic phenotypes has been attributed to variability in levels of Factor VIII and von Willebrand factor, where ABO status may explain as much as 30% of this variability 9Franchini et al.201219Orstavik et al.198512Germain et al.201516Lindström et al.201918O'Donnell et al.2002 Other prominent examples include associations with risks of a number of infectious diseases, to the extent that the allele distribution of the blood group antigens has evolved to reflect some areas endemic to these infectious diseases 11Franchini and Bonfanti2015. This is in part true for infectious disease such as Plasmodium falciparum malaria, Helicobacter pylori, and Vibrio cholera, where ABO blood groups are involved in different aspects of pathogenesis, from microbe attachment and entry into cells to subsequent disease development and severity of disease 23Stowell and Stowell201911Franchini and Bonfanti20156Cserti and Dzik20077Degarege et al.2019. Surface antigens of the ABO blood groups are defined by the immunodominant, terminal sugar residues on certain glycolipids and glycoproteins anchored to the membrane of red blood cells and exposed extracellularly. Even if expressed from a single-gene locus, the ABO gene on chromosome 9, A and B antigens are present not only on erythroid cells but also in many other tissues, and due to the diverse tissue, expression may result in differences in disease occurrence 13Harmening2012. The A and B allelic variants of the ABO locus encode the A and B glycosyltransferases, which differ only by a few amino acid residues, add the donor substrates UDP-N-acetylgalactosamine or UDP-galactose, respectively, to a common acceptor substrate, namely a carbohydrate chain terminating with the so-called H antigen, in turn dependent on fucosyltransferase activity expressed from the FUT1 and FUT2 genes on chromosome 19. In blood group O, the H antigen is left unaltered due to lack of ABO enzyme activity, most commonly by a single-nucleotide deletion in the ABO coding region 22Storry and Olsson2009.

The RhD antigen, on the other hand, has a less clear link to health outcomes. RhD status has mainly been linked to alloimmunization of the pregnant women with hemolytic disease of the fetus and newborn as a consequence 25Urbaniak and Greiss2000. Beyond these direct effects, little is known about its role in disease pathogenesis. The difference between RhD-positive and -negative blood group is the presence or absence of the RhD protein on the red blood cell surface. However, both individuals with and without RhD possess the homologous RhCE protein and Rh-associated glycoprotein (RhAG) on their red cells. Thus, functions carried out by RhD are likely performed RhCE and RhAG in RhD-negative individuals, and this redundancy may in part explain the scarcity of findings related to RhD status 1Avent and Reid2000.

Using the Scandinavian Donation and Transfusion (SCANDAT) database, we have previously studied associations between ABO blood groups and cancer subtypes, cardiovascular and thromboembolic disease, the occurrence of dementia and degradation of bioprosthetic aortic valves in relation to ABO blood group 27Vasan et al.201620Persson et al.201928Vasan et al.201626Vasan et al.2015. However, these and most other prior studies into the association between ABO blood group and disease outcomes have been limited by potentially misdirected a priori hypotheses and phenome-wide disease associations have not been thoroughly explored in a systematic manner. Therefore, in the current study, we aimed to agnostically investigate the association between ABO and RhD blood group and disease occurrence for a large number of disease phenotypes using large-scale population-based Swedish healthcare registries.

Materials and methods

Study population and study design

Individuals in the study were identified using an updated version of the Scandinavian donations and transfusion database (SCANDAT3-S). This database includes close to 8 million individuals who have donated blood, received a blood transfusion, or have had blood group testing done for other reasons. Other reasons for blood group testing would typically be pre-emptive testing for example, before surgery or in antenatal care. The database contains detailed information on blood donations, transfusions, as well as blood group antigen and antibody testing results and is thoroughly described elsewhere 29Zhao et al.2020. It is nationally complete since 1995, but information dates back to 1968 with various levels of completeness, mainly depending on the geographical region. Using unique national registration numbers assigned to all inhabitants of Sweden, the SCANDAT3-S database has been linked to a range of national health outcomes registers, for hospital care, cancer, cause of death, and drug prescriptions . From SCANDAT3-S, we extracted information on ABO and RhD blood group and created a main cohort and a validation cohort. The main cohort consisted of all individuals who were born in Sweden where at least one parent was born in Sweden and who, for any reason, had undergone ABO and RhD blood group typing with a conclusive result, but who did not donate blood within 90 days of the test. Person-time for blood donors were excluded from the main cohort to maximize the representativeness of the study population. In the validation cohort, we included all individuals in the SCANDAT3-S database who had ever donated blood. As such, an individual could contribute person-time in both cohorts, such as in the case a person started to donate blood more than 90 days later from a blood grouping test that was initially performed for other reasons. The person-time before blood donation would contribute to the main cohort censoring at entry in the validation cohort starting at the time of blood grouping before the blood donation.

Outcomes

We defined and studied a large number of disease categories. Non-cancer disease categories were based on discharge diagnoses from the national patient register, which covers all hospital inpatient care in Sweden since 1987 and all specialist outpatient care since 1997, and from the Cause of Death register, which records underlying causes of death for all persons in Sweden since 1964 4Brooke et al.201717Ludvigsson et al.2011. Because the 10th revision of the International Classification of Disease (ICD) was implemented in 1997, we limited outcomes ascertainment to events from 1997 or later to avoid inconsistencies between ICD revisions. Cancer outcomes were based on the Cancer Register, which records all incident cancer cases in Sweden since 1958 2Barlow et al.2009. All of these registries are held and maintained by the Swedish National Board of Health and Welfare and have a high level of completeness and accuracy. Dates of death and emigration were obtained from population registers kept by Statistics Sweden.

Details of non-cancerous disease categories are presented in Supplementary file 3. Non-cancer diseases were classified into disease categories based on the first three codes of the diagnosis, according to the ICD-10 codebook. We did not consider external causes of disease, traumatic injuries, or symptom-based codes as these were deemed unlikely to be related to blood group antigens. Cancer disease categories were based on anatomical coding using the 7th revision of the ICD for all non-hematological malignancies and the 8th revision of the ICD for hematological malignancies. For details of cancer categories, see Supplementary file 4 (SAS code for cancer disease grouping is available upon request).

In total, we considered 1217 distinct disease categories. After database construction, we excluded disease categories with fewer than 50 events before analysis as we would be unlikely to detect sufficient events in the validation cohort in categories with fewer than 50 events in the main cohort.

Statistical methods

All persons were followed from the date of the first blood grouping test, from their 18th birthday, or from January 1, 1997, whichever occurred last. Follow-up was extended until the first incident event in each disease category, emigration, death or December 31, 2017, whichever occurred first. A person could thus be included in follow-up for all disease categories investigated.

Descriptive statistics were presented for cohort baseline data. For the main analysis, we used a Poisson regression model. In the model, we incorporated the following covariates: ABO blood group (A, AB, B or O), RhD status (weak or category expression variants were excluded), sex, calendar-period, and age. A restricted cubic spline functions with four or five knots placed according to Harrell’s method were applied to the age and calendar-period covariates 14Harrell2015. The regression model was fitted separately to each disease category resulting in incidence rate ratios (IRR) for each ABO blood group and RhD status using blood group O and RhD negative as reference, respectively. Wald’s method was used to construct 95% confidence intervals (CI). Equi-dispersion was tested using a Lagrange multiplier test. For disease categories where data demonstrated significant over- or under-dispersion after also performing the same analysis but reducing the number of knots from 5 to 4, analyses were instead run using quasi-Poisson regression.

Multiple testing was handled using a two-stage approach. First, in the exploratory analysis using the main cohort, we applied a false discovery rate (FDR) adjustment of raw p-values assuming positive dependency of stochastic ordering between outcomes. Second, in the confirmatory analysis using the validation cohort, we used the disease categories with significant effects from explorative analysis, with results presented both without adjustment and using a Bonferroni adjustment. In effect, this allowed us to limit type one errors presenting confirmed associations with high certainty, but still not to compromise type two errors for future confirmatory analysis in other cohorts.

Results

Characteristics of the main and validation cohorts are presented in Table 1. When combining the main and validation cohort, there were a total of 5.1 million unique individuals. The main cohort consisted of 4.2 million individuals who at any point had undertaken an ABO and RhD blood antigen test. The distribution of A, AB, B, and O were 47%, 5%, 10%, and 38%, respectively, and 84% of individuals were RhD positive. Women constituted 60% of the cohort. The median age at cohort entry was 52 years (interquartile range [IQR], 30–71) and the median year of birth was 1949 (IQR, 1931–1971).

Baseline characteristics of main and validation cohort.

Main cohort Validation cohort
Number 4,204,234 1,197,522
Age, median (IQR)
Age, median (IQR) 52 (30-71) 30 (23-41)
Year of birth, median (IQR) 1949 (1931–1971) 1966 (1953–1978)
Sex, % 60 49
Blood group, %
A 47 45
AB 5 5
B 10 11
O 38 39
RhD positive, % 84 82

Not accounting for censoring due to disease events, the main cohort accrued a total of 49.9 million person-years of follow-up, 23.7 million in blood group A, 2.3 million in blood group AB, 4.9 million in blood group B, and 18.9 million in blood group O.

Of the original 1217 disease categories, 1090 remained available for analyses after excluding disease categories with fewer than 50 events. The median number of events per disease category in the main cohort was 4748 (IQR, 869–231,166). A meta-summary of results of regression analyses is presented in Table 2, and graphically in the form of a volcano plot in Figure 1 (also, as an interactive, online variant as Supplementary file 1). Alternatively, results are also presented as an ICD chapter-based, variant Manhattan plot in Figure 2 (also as an interactive, online variant as Supplementary file 2). Overall, in the main cohort and before FDR adjustment for multiple testing, there were 343 and 98 statistically significant associations for the ABO and RhD blood group systems and unique disease categories, respectively. Of these, a total of 143 (41%) and 13 (13%) associations between blood group and unique outcome remained statistically significant for ABO and RhD blood group systems, respectively, after FDR adjustment. For the ABO system, IRRs for statistically significant associations after FDR adjustment ranged from 0.57 to 0.99 for negative associations and from 1.01 to 1.52 for positive associations. For RhD status, IRRs ranged from 0.90 to 0.97 for negative associations and from 1.02 to 1.08 for positive associations. Details of all associations identified after FDR are presented in Supplementary file 5 (for ABO blood groups) and Supplementary file 6 (for RhD).

import numpy as np
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
df = pd.read_csv('df.csv')
df_r = pd.read_csv('df_r.csv')
concordant = pd.read_csv('concordant.csv')

fig = go.Figure()
fdr_p=df['fdr_p']


grp=df['bg'].unique().tolist()
for groups in grp:
        data_filtered=df[(df.bg==groups) & (df.fdr_p < 0.05)]
        fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=data_filtered['y'], 
                         mode='markers',
                             opacity=0.5,
                         marker=dict(color=data_filtered['color'],line=dict(color='white',width=0)),
                         text=data_filtered['bg_cat'],
                         customdata=data_filtered['event_pyrs'],
                         hovertext=data_filtered['fdr_p'],
                        meta=data_filtered['combined'],
                        hovertemplate = "<b>%{text}</b>" +
                         "<br>FDR-P: %{hovertext:,.2g}:" +
                         #"<br>IRR: %{marker.size:,.2f}"+
                         "<br>IRR (95% CI): %{meta}" +
                         "<br>Events/Person-years: %{customdata}" +
                         "<extra></extra>",
                         marker_size=(8*data_filtered['irr']),
                         name=groups
                        )
              )



df_r2=df_r[df_r.fdr_p<0.05]
fig.add_trace(go.Scatter(x=df_r2['x'], 
                         y=df_r2['y'], 
                         mode='markers',
                             opacity=0.5,
                         marker=dict(color=df_r2['color'],opacity=df_r2['opacity'],line=dict(color='white',width=0)),
                         text=df_r2['bg_cat'],
                         customdata=df_r2['event_pyrs'],
                         hovertext=df_r2['fdr_p'],
                        meta=df_r2['combined'],
                        hovertemplate = "<b>%{text}</b>" +
                         "<br>FDR-P: %{hovertext:,.2g}:" +
                         #"<br>IRR: %{marker.size:,.2f}"+
                         "<br>IRR (95% CI): %{meta}" +
                         "<br>Events/Person-years: %{customdata}" +
                         "<extra></extra>",
                         marker_size=(8*df_r2['irr']),
                         name='RhD positive'
                        )
              )
              
fig.add_trace(go.Scatter(x=pd.concat([df_r.x[(df_r.fdr_p>=0.05)],df.x[(df.fdr_p>=0.05)]]), 
                         y=pd.concat([df_r.y[(df_r.fdr_p>=0.05)],df.y[(df.fdr_p>=0.05)]]), 
                         mode='markers',
                             opacity=0.7,
                         marker=dict(color=pd.concat([df_r.color[(df_r.fdr_p>=0.05)],df.color[(df.fdr_p>=0.05)]]),opacity=0.7,line=dict(color='white',width=0)),
                         name='Non-significant ABO and RhD',
                         showlegend=True,
                        )
              )
    
    

fig.add_trace(go.Scatter(x=concordant.x, 
                         y=concordant.y, 
                         mode='markers',
                             opacity=0.8,
                         marker=dict(color='black',opacity=0.8,line=dict(color='white',width=0)),
                         text=concordant['bg_cat'],
                         customdata=concordant['event_pyrs'],
                         hovertext=concordant['pvalue'],
                        meta=concordant['combined'],
                        hovertemplate = "<b>%{text}</b>" +
                         "<br>P-value: %{hovertext:,.2g}:" +
                         "<br>IRR: %{marker.size:,.2f}"+
                         "<br>IRR (95% CI): %{meta}" +
                         "<br>Events/Person-years: %{customdata}" +
                         "<extra></extra>",
                         marker_size=(5*concordant['irr']),
                         name='Concordant between Main and Donor cohort, ABO and RhD'
                        )
              )


fig.add_shape(
       # Line Horizontal
          type="line",
         x0=-0.8,
        x1=0.8,
        y0=-(np.log10(0.05)),
        y1=-(np.log10(0.05)),
           line=dict(
              color="black",
             width=0.5,
            dash="dot"
       ), opacity=1,
)
   
    
#Layout
fig.update_layout(title='<b>Volcanoplot showing Incidence Rate Ratios/False Discovery Rate Adjusted P-Values Depending On ABO Blood Group and RhD Status'
                  ''
                  '<br>',
                  title_font_color = '#333333',
                  title_font_size = 14,
                  
                  font=dict(family="helvetica"),
                  
                  xaxis_title='<b>IRR',
                  xaxis_visible=True,
                  xaxis_showline=True,

                  #xaxis_type='category',
                  xaxis_gridcolor='white',
                  #xaxis_tickangle = 90,
                  xaxis_range=[-0.8,0.8],
                  xaxis_showgrid=False,
                  xaxis_tickvals=[-0.5, 0, 0.5],
                  xaxis_linecolor='black',
                  
                  plot_bgcolor='white',
                  showlegend=True,
                  legend= {'itemsizing': 'constant'},
                  hoverlabel=dict(
                        bgcolor="white", 
                        font_size=18, 
                        font_family="helvetica"),
                  
                  yaxis_ticks=('outside'),
                  yaxis_tickwidth=1,
                  yaxis_ticklen=5,
                  yaxis_title='<b>-log10(FDR-adjusted p-value)',
                  yaxis_showline=True,
                  yaxis_showgrid=False,
                  yaxis_visible=True,
                  yaxis_linewidth=1,
                  yaxis_linecolor='black',
                  yaxis_range=[-5,140],
                  #yaxis_tickangle = 90,
                  yaxis_tickvals=[-(np.log10(0.05)),50, 100],
                  yaxis_ticktext=['FDR-P 0.05',50,100],
                  #yaxis_ticksuffix='%',
                  
                  width=1000,
                  height=900
                  )

fig.show()

Volcano plot of all findings from main and validation cohort.

Volcano plot depicting spread of p-values of significant and non-significant ABO and RhD blood groups for main cohort and validated results. The labels represent the nine findings with the lowest p-value in the validation cohort.

df = pd.read_csv('df_man.csv')
df_r = pd.read_csv('df_r_man.csv')
concordant = pd.read_csv('concordant_man.csv')
mchap = pd.read_csv('mchap.csv')

fig = go.Figure()
fdr_p=df['fdr_p']

grp=df['bg'].unique().tolist()
for groups in grp:
        data_filtered=df[(df.bg==groups) & (df.fdr_p < 0.05)]
        fig.add_trace(go.Scatter(x=data_filtered['row'], 
                         y=data_filtered['y'], 
                         mode='markers',
                             opacity=0.5,
                         marker=dict(color=data_filtered['color'],line=dict(color='white',width=0)),
                         text=data_filtered['bg_cat'],
                         customdata=data_filtered['event_pyrs'],
                         hovertext=data_filtered['fdr_p'],
                     
                        meta=data_filtered['combined'],
                        hovertemplate = "<b>%{text}</b>" +
                         "<br>FDR-P: %{hovertext:,.2g}:" +
                         "<br>IRR (95% CI): %{meta}" +
                         "<br>Events/Person-years: %{customdata}" +
                         "<extra></extra>",
                         marker_size=(9*data_filtered['irr']),
                         name=groups
                        )
              )



df_r2=df_r[df_r.fdr_p<0.05]
fig.add_trace(go.Scatter(x=df_r2['x'], 
                         y=df_r2['y'], 
                         mode='markers',
                             opacity=0.5,
                         marker=dict(color=df_r2['color'],opacity=df_r2['opacity'],line=dict(color='white',width=0)),
                         text=df_r2['bg_cat'],
                         customdata=df_r2['event_pyrs'],
                         hovertext=df_r2['fdr_p'],
                        meta=df_r2['combined'],
                        hovertemplate = "<b>%{text}</b>" +
                         "<br>FDR-P: %{hovertext:,.2g}:" +
                         "<br>IRR (95% CI): %{meta}" +
                         "<br>Events/Person-years: %{customdata}" +
                         "<extra></extra>",
                         name='RhD positive'
                        )
              )
              
fig.add_trace(go.Scatter(x=pd.concat([df_r.x[(df_r.fdr_p>=0.05)],df.x[(df.fdr_p>=0.05)]]), 
                         y=pd.concat([df_r.y[(df_r.fdr_p>=0.05)],df.y[(df.fdr_p>=0.05)]]), 
                         mode='markers',
                             opacity=0.7,
                         marker=dict(color=pd.concat([df_r.color[(df_r.fdr_p>=0.05)],df.color[(df.fdr_p>=0.05)]]),opacity=0.7,line=dict(color='white',width=0)),

                         marker_size=2,
                         name='Non-significant ABO and RhD',
                         showlegend=True,
                        )
              )
    
    


fig.add_trace(go.Scatter(x=concordant.x, 
                         y=concordant.y, 
                         mode='markers',
                             opacity=0.8,
                         marker=dict(color=concordant['color'],opacity=0.8,line=dict(color='white',width=0)),
                         text=concordant['bg_cat'],
                        customdata=concordant['event_pyrs'],
                         hovertext=concordant['bon_p'],
                        meta=concordant['combined'],
                        hovertemplate = "<b>%{text}</b>" +
                         "<br>BON-P: %{hovertext:,.2g}:" +
                         "<br>IRR (95% CI): %{meta}" +
                         "<br>Events/Person-years: %{customdata}" +
                         "<extra></extra>",
                         marker_size=(5*concordant['irr']),
                         name='Concordant in validation cohort, after bonferroni-adjustment'
                        )
              )

fig.add_trace(go.Scatter(x=[], 
                         y=[],
                        mode='markers',
                         xaxis='x2'
                        )
             )

fig.add_shape(
       # Line Horizontal
          type="line",
         x0=0,
        x1=df.x.max()+1,
        y0=-(np.log10(0.05)),
        y1=-(np.log10(0.05)),
           line=dict(
              color="black",
             width=0.5,
            dash="dot"
       ), opacity=1,
)

    
#Layout
fig.update_layout(
    title='<b>Manhattanplot - Disease catagories/False Discovery Rate Adjusted P-Values In Main Cohort Depending On ABO Blood Group. </b> <br>'
                  ''
                  '',
                  title_font_color = '#333333',
                  title_font_size = 14,
                  
                  font=dict(family="helvetica"),
                  
                  xaxis=dict(
                      anchor='y',
                      title='<b>',
                      visible=True,
                      showline=True,
                      gridcolor='white',
                      tickangle = 300,
                      range=[0,df.x.max()],
                      showgrid=False,
                      ticks=('inside'),
                      ticklen=0,
                     # tickangle=0,
                      tickvals=mchap['median'],
                      ticktext=mchap['names'].tolist(),
                      linecolor='black',
                      linewidth=1),

                  xaxis2=dict(
                      anchor='y',
                      overlaying='x',
                      title='<b>',
                      visible=True,
                      showline=True,
                      gridcolor='white',
                      tickangle = 0,
                      range=[0,df.x.max()],
                      showgrid=False,
                      ticklen=5,
                      tickvals=mchap['mins'],
                      showticklabels=False,
                   #   ticktext=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",],
                      linecolor='black',
                      tickcolor='black',
                      ticks=('outside'),
                      linewidth=1),

                  plot_bgcolor='white',
                  showlegend=True,
                  legend= {'itemsizing': 'constant'},
                  hoverlabel=dict(
                        bgcolor="white", 
                        font_size=18, 
                        font_family="helvetica"),
                  
                  yaxis_ticks=('outside'),
                  yaxis_tickwidth=1,
                  yaxis_ticklen=5,
                  yaxis_title='<b>-log10(FDR-adjusted p-value)',
                  yaxis_showline=True,
                  yaxis_showgrid=False,
                  yaxis_visible=True,
                  yaxis_linewidth=1,
                  yaxis_linecolor='black',
                  #yaxis_range=[-5,190],
                  #yaxis_tickangle = 90,
                  yaxis_tickvals=[-(np.log10(0.05)),50, 100],
                  yaxis_ticktext=['P 0.05',50,100],
                               #yaxis_ticksuffix='%',
                  yaxis_range=[-0.5,130],
                  
                  width=1200,
                  height=1200
                  )

    

fig.show()

Manhattan plot of all findings from main and validation cohort mapped by ICD chapter.

Manhattan plot depicting distribution of p-values for significant and non-significant associations between ABO and RhD blood groups and available outcomes for main cohort and validated results mapped by disease chapter in ICD.

Meta-summary of results.

Main cohort Validation cohort
Individuals 4,204,234 1,197,522
Person-years, sum 50 M 22 M
Events, median (IQR) 4748 (869–23,166) 7129 (2464–19,973)
A AB B ABO total RhD positive A AB B ABO total RhD positive
Before adjustment 229 129 179 537 106 64 37 42 143 5
Positive effects, N 150 79 107 336 61 47 23 22 92 3
Negative effects, N 79 50 72 201 45 17 14 20 51 2
After adjustment* 108 56 70 234 13 26 13 10 49 1
Positive effects, N 66 38 36 140 10 19 10 6 35 1
Negative effects, N 42 18 34 94 3 7 3 4 14 0
Positive IRR, median (range) 1.05 (1.01–1.72) 1.09 (1.03–1.52) 1.09 (1.02–1.39) 1.05 (1.02–1.08) 1.1 (1.03–1.57) 1.32 (1.07–1.89) 1.5 (1.07–1.64) 1.12 (1.12–1.12)
Negative IRR, median (range) 0.95 (0.77–0.99) 0.92 (0.74–0.97) 0.92 (0.57–0.98) 0.97 (0.9–0.97) 0.92 (0.86–0.95) 0.84 (0.81–0.87) 0.88 (0.83–0.93) -

In our validation cohort, consisting of almost 1.2 million blood donors accruing 22 million person-years of follow-up, we validated the findings from the significant disease categories from the first analysis. Among the 143 and 5 significant disease categories for ABO and RhD, respectively, the median number of events was 7129 (IQR 2464–19,973). Before multiple testing adjustment, we identified 160 associations between a blood group in 143 and 5 disease categories, for the ABO and RhD blood group, respectively. After Bonferroni adjustment, there were 49 and 1 associations remaining between ABO and RhD blood group, respectively (Table 2 and Figure 3).

df = pd.read_csv('fig3.csv')
concordant = pd.read_csv('concor_engcat.csv')


fig = make_subplots(cols=7, 
                    shared_yaxes='rows', 
                    column_widths=[0.20,0.08,0.20,0.08,0.20,0.08,0.01], 
                    horizontal_spacing = 0.01,
                    subplot_titles=("<b>A", "<i>P", "<b>AB", "<i>P","<b>B","<i>P"),
                  # column_titles=("A", "", "B", "","AB","")
                   )


dfa=df[df['bg']=="A"]
engcat=dfa['engcat'].tolist()

for cat in engcat:
    data_filtered=dfa[(dfa.engcat==cat)]
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=10,
                        marker=dict(color=data_filtered['color'],size=10,symbol='square', opacity=0.5),
                        opacity=0.5,
                         
                         error_x=dict(type='data',
                                     symmetric=False,
                                     array=data_filtered['up']-data_filtered['x'],
                                     arrayminus=data_filtered['x']-data_filtered['lo'],
                                     color=data_filtered['color'].min(),
                           
                                     thickness=10,
                                     width=0)
                       
                ), row=1, col=1
              )
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=7,
                        marker=dict(color=data_filtered['color'],size=8,symbol='line-ns-open', opacity=1),
                        
                       
                ), row=1, col=1
              )

    
    fig.add_trace(go.Scatter(x=[0.05], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='text',
                             text=(data_filtered['pvalue'].map('{:.2g}'.format)),
                             textposition="middle right",
                         marker_symbol='square',
                         marker_size=10,
                         marker_color=data_filtered['color'],
                         opacity=1,                     
                       
                ), row=1, col=2
              )
    databon=data_filtered[data_filtered['bon_p']<0.05]
    fig.add_trace(go.Heatmap(
                   z=databon['bon_p'],
                   x=[0.5,1.5,2.5,3.5],
                   y=[databon['names'],databon['engcat']],
                showscale=False,
                text=databon['pvalue'],
                opacity=0.2,
                 ygap=4,
                xgap=4,
                colorscale=[[0.0, "white"], [1,np.where(pd.isna(databon['color'].min()),'white',databon['color'].min()).tolist()]],

                            ), row=1, col=2,
                )

    
dfb=df[df['bg']=="AB"]
engcat=dfb['engcat'].tolist()

for cat in engcat:
    data_filtered=dfb[(dfb.engcat==cat)]
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=10,
                        marker=dict(color=data_filtered['color'],size=10,symbol='square', opacity=0.5),
                        opacity=0.5,
                         
                         error_x=dict(type='data',
                                     symmetric=False,
                                     array=data_filtered['up']-data_filtered['x'],
                                     arrayminus=data_filtered['x']-data_filtered['lo'],
                                     color=data_filtered['color'].min(),
                           
                                     thickness=10,
                                     width=0)
                       
                ), row=1, col=3
              )
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=7,
                        marker=dict(color=data_filtered['color'],size=8,symbol='line-ns-open', opacity=1),
                        
                       
                ), row=1, col=3
              )
    
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=10,
                        marker=dict(color='lightgrey',size=10,symbol='square', opacity=0.5),
                        opacity=0.5,
                         
                         error_x=dict(type='data',
                                     symmetric=False,
                                     array=data_filtered['up']-data_filtered['x'],
                                     arrayminus=data_filtered['x']-data_filtered['lo'],
                                     color='lightgrey',
                           
                                     thickness=10,
                                     width=0)
                       
                ), row=1, col=3
              )
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=7,
                        marker=dict(color='black',size=8,symbol='line-ns-open', opacity=0.5),
                        
                       
                ), row=1, col=3
              )

    fig.add_trace(go.Scatter(x=[0.05], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='text',
                             text=(data_filtered['pvalue'].map('{:.2g}'.format)),
                             textposition="middle right",
                         marker_symbol='square',
                         marker_size=10,
                         marker_color=data_filtered['color'],
                         opacity=1,                     
                       
                ), row=1, col=4
              )
    databon=data_filtered[data_filtered['bon_p']<0.05]
    fig.add_trace(go.Heatmap(
                   z=databon['bon_p'],
                   x=[0.5],
                   y=[databon['names'],databon['engcat']],
                showscale=False,
                text=databon['pvalue'],
                opacity=0.5,
                 ygap=4,
                xgap=4,
                colorscale=[[0.0, "white"], [1,np.where(pd.isna(databon['color'].min()),'white',databon['color'].min()).tolist()]],
                            ), row=1, col=4,
                )
    
dfc=df[df['bg']=="B"]
engcat=dfc['engcat'].tolist()

for cat in engcat:
    data_filtered=dfc[(dfc.engcat==cat)]
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=10,
                        marker=dict(color=data_filtered['color'],size=10,symbol='square', opacity=0.5),
                        opacity=0.5,
                         
                         error_x=dict(type='data',
                                     symmetric=False,
                                     array=data_filtered['up']-data_filtered['x'],
                                     arrayminus=data_filtered['x']-data_filtered['lo'],
                                     color=data_filtered['color'].min(),
                           
                                     thickness=10,
                                     width=0)
                       
                ), row=1, col=5
              )
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=7,
                        marker=dict(color=data_filtered['color'],size=8,symbol='line-ns-open', opacity=1),
                        
                       
                ), row=1, col=5
              )    
    
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=10,
                        marker=dict(color='lightgrey',size=10,symbol='square', opacity=0.5),
                        opacity=0.5,
                         
                         error_x=dict(type='data',
                                     symmetric=False,
                                     array=data_filtered['up']-data_filtered['x'],
                                     arrayminus=data_filtered['x']-data_filtered['lo'],
                                     color='lightgrey',
                           
                                     thickness=10,
                                     width=0)
                       
                ), row=1, col=5
              )
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=7,
                        marker=dict(color='black',size=8,symbol='line-ns-open', opacity=0.5),
                        
                       
                ), row=1, col=5
              )

    fig.add_trace(go.Scatter(x=[0.05], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='text',
                             text=(data_filtered['pvalue'].map('{:.2g}'.format)),
                             textposition="middle right",
                         marker_symbol='square',
                         marker_size=10,
                         marker_color=data_filtered['color'],
                         opacity=1,                     
                       
                ), row=1, col=6
              )
    databon=data_filtered[data_filtered['bon_p']<0.05]
    fig.add_trace(go.Heatmap(
                   z=databon['bon_p'],
                   x=[0.5,1.5,2.5,3.5],
                   y=[databon['names'],databon['engcat']],
                showscale=False,
                text=databon['pvalue'],
                opacity=0.5,
                 ygap=4,
                xgap=4,
                colorscale=[[0.0, "white"], [1,np.where(pd.isna(databon['color'].min()),'white',databon['color'].min()).tolist()]],

                            ), row=1, col=6,
                )

    
    
dfc=df[df['bg']=="AB"]
engcat=dfc['engcat'].tolist()

for cat in engcat:
    data_filtered=dfc[(dfc.engcat==cat)]
    fig.add_trace(go.Scatter(x=data_filtered['x'], 
                         y=[data_filtered['names'],data_filtered['engcat']], 
                         mode='markers',
                        marker_symbol='line-ns-open',
                        marker_size=7,
                        marker=dict(color='white',size=8,symbol='line-ns-open', opacity=1),
                        
                       
                ), row=1, col=7
              )    
                                                                

        

         
fig.add_shape(
       # Line Horizontal
          type="line",
         x0=0,
        x1=0,
        y0=-0.5,
        y1=(df.engcat.nunique()-0.5),
           line=dict(
              color="black",
             width=0.5,
            dash="dot"
       ), opacity=1,row=1, col=1,
)      

fig.add_shape(
       # Line Horizontal
          type="line",
         x0=0,
        x1=0,
        y0=-0.5,
        y1=(df.engcat.nunique()-0.5),
           line=dict(
              color="black",
             width=0.5,
            dash="dot"
       ), opacity=1,row=1, col=3,
)      

fig.add_shape(
       # Line Horizontal
          type="line",
         x0=0,
        x1=0,
        y0=-0.5,
        y1=(df.engcat.nunique()-0.5),
           line=dict(
              color="black",
             width=0.5,
            dash="dot"
       ), opacity=1,row=1, col=5,
)      
 

fig.add_annotation(
            x=1,
            y=(df.engcat.nunique()),
            yshift=20,
            text="<b>FDR-p",
            yref="paper",
            showarrow=False,
            row=1, col=4
            )


fig.add_annotation(
            x=2.4,
            y=(df.engcat.nunique()),
            yshift=20,
            #xshift=3,
            text="<b>Events",
            yref="paper",
            showarrow=False,
            row=1, col=4
            )
   

fig.add_annotation(
            x=1,
            y=(df.engcat.nunique()),
            yshift=20,
            text="<b>FDR-p",
            yref="paper",
            showarrow=False,
            row=1, col=6
            )



fig.add_shape(type="line",xref="paper", x0=-0.915,x1=-0.915,y0=-0.5,y1=(concordant.engcat.nunique()-0.5),line=dict(color="black",width=1))      




#Layout
fig.update_layout(
#     title='<b>Concordant Results Between Main and Donor Cohort</b>' 
#                      '<br>Black Marker And Corresponding Interval Represents Validation Cohort'
#                       '<br>FDR-adjusted P-Values In Column',
                  
                  title_font_color = '#333333',
                  title_font_size = 16,
                  
                  font=dict(family="helvetica"),
                  
                  coloraxis=dict(showscale=False, colorscale="RdBu",cmid=1.00, cmin=0.01,cmax=1.99),
                  
                  xaxis_title='<b>Incidence rate ratios',
                  xaxis_visible=True,
                  xaxis_showline=True,
                  xaxis_zeroline=False,

                  yaxis_type='multicategory',
                  xaxis_gridcolor='white',
                  #xaxis_tickangle = 90,
                  xaxis_range=[-0.5,10],
                  xaxis_tickvals=[1,2,3,4,5,6,7,8,9],
                  xaxis_mirror="allticks",
                  xaxis_showgrid=False,
      #            xaxis_tickvals=[0, 1, 2],
                  xaxis_linecolor='black',
                  
                  plot_bgcolor='white',
                  showlegend=False,
                 # legend= {'itemsizing': 'constant'},
                 # hoverlabel=dict(
                 #       bgcolor="white", 
                 #       font_size=18, 
                 #       font_family="helvetica"),
                #  yaxis_anchor='free',
               #   yaxis_fixedrange=True,
                  yaxis_range=[-0.5,(df.engcat.nunique()-0.5)],
      #            yaxis_position=0,
                 # yaxis_ticks=('outside'),
       #           yaxis_tickwidth=1,
        #          yaxis_ticklen=5,
                  #yaxis_title='<b>-log10(False discovery rate p-value)',
                  yaxis_showline=True,
                  yaxis_showdividers=True,
                  yaxis_dividerwidth=2,
                 # yaxis_tickson="boundaries",

                  yaxis_showgrid=False,
                  yaxis_visible=True,
                  yaxis_linewidth=1,
                  yaxis_linecolor='black',
  
                  width=1200,
                  height=1550,
                margin=dict(
        l=550,
        r=50,
        b=20,
        t=20,
        pad=4
    ),
                  )

# yaxis
fig.update_yaxes(title_text="",linecolor='black',visible=True,showline=True,dividerwidth=2,showgrid=False,showdividers=True,row=1, col=5)
fig.update_yaxes(title_text="",linecolor='black',visible=True,showline=True,dividerwidth=2,showgrid=False,showdividers=True,row=1, col=7)

fig.update_yaxes(title_text="",linecolor='black',visible=True,showline=True,showgrid=False,dividerwidth=2,showdividers=True,row=1, col=3)
fig.update_yaxes(title_text="",linecolor='black',visible=True,showline=True,dividerwidth=2,showdividers=True,row=1, col=2)
fig.update_yaxes(title_text="",linecolor='black',visible=True,showline=True,dividerwidth=2,showdividers=True,row=1, col=4)
fig.update_yaxes(title_text="",linecolor='black',visible=True,showline=True,dividerwidth=2,showdividers=True,row=1, col=6)


# xaxis
fig.update_xaxes(title_text='',visible=True,showline=False,tickfont_size = 9,range=[-np.log10(2),np.log10(2)],tickvals=[-np.log10(2),0,np.log10(2)],ticktext=['-2','0','2'],gridcolor='lightgrey',showgrid=False,linewidth=3,linecolor='black',row=1, col=1)
fig.update_xaxes(title_text='',visible=False,showline=True,tickfont_size = 9,range=[0,1],gridcolor='black',tickangle = 300,ticklen=0,showgrid=False,linecolor='black',row=1, col=2)
fig.update_xaxes(title_text='<b>log(Incidence Rate Ratio)',visible=True,showline=False,tickfont_size = 9,range=[-np.log10(2),np.log10(2)],tickvals=[-np.log10(2),0,np.log10(2),np.log10(3),np.log10(4),np.log10(5)],ticktext=['-2','0','2','3','4','5'],gridcolor='black',showgrid=False,linewidth=3,linecolor='black',row=1, col=3)
fig.update_xaxes(title_text='',visible=False,showline=True,tickfont_size = 9,range=[0,1],gridcolor='black',tickangle = 300,ticklen=0,showgrid=False,linecolor='black',row=1, col=4)
fig.update_xaxes(title_text='',visible=True,showline=False,tickfont_size = 9,range=[-np.log10(2),np.log10(2)],tickvals=[-np.log10(2),0,np.log10(2),np.log10(3)],ticktext=['-2','0','2','3'],gridcolor='black',gridwidth=2,showgrid=False,linewidth=3,linecolor='black',row=1, col=5)
fig.update_xaxes(title_text='',visible=False,showline=True,tickfont_size = 9,range=[0,1],gridcolor='black',tickangle = 300,ticklen=0,showgrid=False,linecolor='black',row=1, col=6)
fig.update_xaxes(title_text='',visible=False,showline=True,type='category',tickfont_size = 9,range=[0,3],gridcolor='white',tickangle = 300,ticklen=0,showgrid=False,linecolor='black',row=1, col=7)




fig.show()

All significant un-adjusted findings from the validation cohort.

Significant disease categories in the validation cohort. Blood group as compared to blood group O and log10(IRR) displayed with 95% confidence bands. All p-values are raw, highlighted p-value indicates associations that remained statistically significant also after Bonferroni adjustment.

A number of previously well-established associations were seen among the Bonferroni-adjusted results. For thrombosis, blood group A had a higher risk as compared to blood group O (e.g., pulmonary embolism, IRR 1.57 [95% CI, 1.51–1.64] and portal vein thrombosis, IRR 1.51 [95% CI, 1.25–1.83]). Bleeding disorders were more frequent in blood group O as compared to blood group A (e.g., gastric ulcer, IRR 0.92 [95% CI, 0.88–0.95] and duodenal ulcer, IRR 0.86 [95% CI, 0.82–0.9]). Thyrotoxicosis was also less common in blood groups A and AB as compared to blood group O (with IRRs of 0.90 [95% CI, 0.86–0.93] and 0.84 [95% CI, 0.77–0.92], for A and AB, respectively). Pregnancy-induced hypertension was less common in blood groups A and AB, as compared to blood group O (with IRRs of 0.95 [95% CI, 0.92–0.97] and 0.87 [95% CI, 0.83–0.92] for A and AB, respectively). Pancreatic cancer was the only malignancy that remained associated with a blood group, specifically blood group A as compared to blood group O (IRR, 1.29; 95% CI, 1.19–1.40). A new finding was that of calculus of the kidney and ureter, which were found to be less common in blood group B as compared to blood group O (IRR 0.93 [95% CI, 0.89–0.96]). Cholelithiasis, which has been disputed, was more common in blood groups A and AB as compared to blood group O (with IRRs of 1.07 [95% CI, 1.05–1.09] and 1.09 [95% CI, 1.05–1.13] for A and AB, respectively).

In disease categories not significant after Bonferroni adjustment, some findings exhibited particularly strong effects, such as for viral and other specified intestinal infections, where blood group AB had a significantly lower risk, as compared to blood group O (IRR 0.74; 95% CI, 0.62–0.87). There was a lower risk for ankylosing spondylitis in blood group AB as compared to blood group O (IRR 0.79; 95% CI, 0.67–0.94), and for acute pancreatitis, again with a lower risk in blood group AB as compared to blood group O (IRR 1.14; 95% CI, 1.04–1.24). For the RhD positive as compared to RhD negative, only one disease category remained statistically significant after Bonferroni adjustment, namely pregnancy-induced hypertension (IRR 1.12; 95% CI, 1.09–1.16). Strong effects identified in the main cohort, but not in the validation cohort were hereditary factor VIII deficiency in blood group B (IRR 0.57; 95% CI, 0.42–0.77), well-differentiated thyroid cancer in blood groups AB (IRR 0.74; 95% CI, 0.62–0.88) and B (IRR 0.79; 95% CI, 0.70–0.90), measles in blood group A (IRR 1.72; 95% CI, 1.23–2.39), as well as both erythema nodosum (IRR 1.32; 95% CI, 1.15–1.53) and sarcoidosis in blood group B (IRR 1.15; 95% CI, 1.08–1.23), as compared to blood group O.

Discussion

In this large cohort study of 5.1 million unique persons followed over 70 million person-years, we performed an agnostic analysis of associations between the ABO and RhD blood groups and the risk of 1217 distinct disease categories. After multiple testing adjustment and comparison with a validation cohort, 49 and 1 associations between disease categories and blood group for ABO and RhD remained significant, respectively. Overall, we were able to confirm a number of previously known associations such as risk of thrombosis and hemorrhagic events. In addition, we also identified novel associations, some with firm evidence and valid even after conservative Bonferroni adjustment, in the validation cohort, including calculus of the kidney and ureter. Furthermore, being the largest study so far, we also found that blood groups A and AB had a lower risk of gestational hypertension, compared to blood group O, which has previously been disputed 5Clark and Wu200810Franchini et al.201615Lee et al.2012. Of the identified associations, we speculate that some associations may be driven by increased screening due to other concomitant diseases that are associated with blood groups, which might be the case for hyperlipidemias that are screened for in heart disease. Most of the investigated disease or disease groups, however, do not seem to be strongly influenced by the ABO blood group of the individual. As to possible mechanisms explaining the associations identified, we may only generate hypothesis to be further tested. It is however peculiar to identify a condition, such as renal caliculi, with highly variable distribution, in regard to geographic region, to have an association to blood group. A possible mechanism could be, when considering the full spectrum of disease categories investigated, that lower urine pH in diabetic patients, a disease category associated with an increased incidence in blood group B, may result in altered stone formation 21Sorokin et al.2017.

In previous studies, intending to dissect the association between blood groups and disease, there is diversity in findings and non-findings, something that may be a consequence of ethnic or geographic group, sample size, complexity of statistical modeling, or disease classifications used. This, however, imposes difficulties when comparing our results to the vast number of studies available concentrating the mentioned discoveries to a select few disease categories.

This is hitherto the largest study investigating blood group antigens and disease occurrence in an effort to find novel and confirm previously known associations. There are some particular strengths to our approach and data. Most notably, the study was based on a very large study population, representing one third of the Swedish population, with long-term and unbiased follow-up. This ensures both the reliability and the generalizability of the results. The agnostic approach also has the advantage of not being based on specific pre-set conceptions of specific disease categories and possible associations of blood group. All disease categories are treated equally and investigated using the same principles effectively removing researcher bias. Moreover, the data has been collected prospectively in various high-quality healthcare registries during a long time period with almost complete coverage. In addition, the fact that all blood group data in the SCANDAT3-S database were collected from clinical transfusion registers – the quality of which is essential for the safe administration of blood transfusions – ensures that there should be little or no errors in the blood group coding. Similarly, while the validity of the outcomes registration certainly varies between the different disease categories, the degree of such misclassification is unlikely to vary between blood groups, and so it should not affect the magnitude of point estimates.

The current study is limited by several factors. One such factor is the disease classification scheme used, based primarily on ICD revision 10 categories that in some instances may lack precision. Smaller disease entities were not accounted for and thus there may be true associations that were missed. It is thus possible that some of the associations that we reported were driven by multiple unknown associations within a specific disease category that may have unequal, or even detrimental, effects on the outcome. However, we believe that this limitation is an opportunity for further sub-categorized investigations in the future when even more events and follow-up time are available.

Another limitation that prevents strong casual inference is the possibility some of the observed associations between ABO blood group and disease categories were driven by other disease associations with ABO blood group. This might, for example, be the case for the associations between blood group A and diabetes as well as hyperlipidemia, which are potentially driven not by a causal association but possibly instead by an association between blood group A and ischemic heart disease, at the occurrence of which diabetes and lipid disorders are screened for and thus frequently diagnosed. We cannot exclude the possibility that some of the other associations were driven by similar non-causal mechanisms.

To limit the possibility of false-positive findings, we handled over-dispersed Poisson models using Quasi-Poisson and also in the main cohort applied the FDR approach, described by Benjamini and Hochberg, and then utilized a Bonferroni adjustment on the sub-grouped outcomes in the validation cohort. The aim of this approach was to reduce type one errors without being overly conservative by first conducting an explorative analysis in the main cohort. We also employed a confirmatory analysis with a validation cohort to further limit the possibility of false-positive findings. However, because the validation cohort was both smaller and consisted only of blood donors, who were selected for their good health, the ensuing smaller number of events may result in failure to detect potentially interesting associations. Furthermore, selecting explicitly healthy donors with no known serious health issue at time of start of donation may result in failure to detect less common or specifically non-acquired or early acquired disease. However, in the validation cohort, only approximately 1% of the categories had fewer events than 50 and all findings from the main cohort can be seen in Figures 1 and 2 and Supplementary files 5–8. It may still be informative to consider also some of the associations from the main cohort that were not corroborated in the validation cohort. This is exemplified by pancreatic cancer where we saw an increased risk in blood groups AB and B in the main cohort (IRR 1.37 and 1.129, p<0.00001 and p<0.00001 for AB and B, respectively) and a similar, yet non-significant effect in the validation cohort (IRR 1.14 and 1.26, p-value 0.8 and 0.6 for B and AB, respectively). This also expands to the non-findings in terms of cancerous disease were multiple relationships that have previously been demonstrated, but not in the validation cohort after Bonferroni adjustment 28Vasan et al.2016. This strengthens our decision to not limit the presentation of findings to only disease categories identified in the conservative Bonferroni-adjusted analysis.

Still, after these limitations we believe that our findings support and generate strong further evidence for previously known associations and indicate new and interesting relationships for disease such as calculus of the kidney and ureter, pregnancy-induced hypertension, well-differentiated thyroid cancer, and sarcoidosis. The new set of associations should be validated in other cohorts but also investigated using a mechanistic approach for a possible causal and biological interaction.

References

    The rh blood group system: a review95Blood375387
    • doi10.1182/blood.V95.2.375
    • pmid10627438
    The completeness of the swedish Cancer register – a sample survey for year 199848Acta Oncologica2733
    • doi10.1080/02841860802247664
    ABO blood groups in relation to ischaemic heart disease1BMJ16461650
    • doi10.1136/bmj.1.5293.1646
    • pmid13873429
    The swedish cause of death register32European Journal of Epidemiology765773
    • doi10.1007/s10654-017-0316-1
    • pmid28983736
    ABO(H) blood groups and pre-eclampsia a systematic review and meta-analysis100Thrombosis and Haemostasis469474
    • doi10.1160/TH08-05-0302
    • pmid18766264
    The ABO blood group system and Plasmodium falciparum malaria110Blood22502258
    • doi10.1182/blood-2007-03-077602
    • pmid17502454
    Effect of the ABO blood group on susceptibility to severe malaria: a systematic review and meta-analysis33Blood Reviews5362
    • doi10.1016/j.blre.2018.07.002
    • pmid30029997
    Risk of gastric Cancer and peptic ulcers in relation to ABO blood type: a cohort study172American Journal of Epidemiology12801285
    • doi10.1093/aje/kwq299
    • pmid20937632
    ABO blood group, Hypercoagulability, and cardiovascular and Cancer risk49Critical Reviews in Clinical Laboratory Sciences137149
    • doi10.3109/10408363.2012.708647
    • pmid22856614
    Relationship between ABO blood group and pregnancy complications: a systematic literature analysis14Blood Transfusion = Trasfusione Del Sangue441448
    • doi10.2450/2016.0313-15
    • pmid27177402
    Evolutionary aspects of ABO blood group in humans444Clinica Chimica Acta6671
    • doi10.1016/j.cca.2015.02.016
    Meta-analysis of 65,734 individuals identifies TSPAN15 and SLC44A2 as two susceptibility loci for venous thromboembolism96The American Journal of Human Genetics532542
    • doi10.1016/j.ajhg.2015.01.019
    • pmid25772935
    Modern Blood Banking and Transfusion PracticesDavis Company
    Regression Modeling Strategies: With Applications to Linear Models, Logistic and Ordinal Regression, and Survival AnalysisSpringer International Publishing
    • doi10.1007/978-3-319-19425-7
    ABO and RhD blood groups and gestational hypertensive disorders: a population-based cohort study119BJOG: An International Journal of Obstetrics & Gynaecology12321237
    • doi10.1111/j.1471-0528.2012.03421.x
    A large-scale exome array analysis of venous thromboembolism43Genetic Epidemiology449457
    • doi10.1002/gepi.22187
    • pmid30659681
    External review and validation of the swedish national inpatient register11BMC Public Health
    • doi10.1186/1471-2458-11-450
    • pmid21658213
    Amount of H antigen expressed on Circulating von willebrand factor is modified by ABO blood group genotype and is a major determinant of plasma von willebrand factor antigen levels22Arteriosclerosis, Thrombosis, and Vascular Biology335341
    • doi10.1161/hq0202.103997
    • pmid11834538
    Factor VIII and factor IX in a twin population evidence for a major effect of ABO locus on factor VIII level37American Journal of Human Genetics89101
    • pmid3919575
    ABO blood type and risk of porcine bioprosthetic aortic valve degeneration: swedeheart observational cohort study9BMJ Open
    • doi10.1136/bmjopen-2019-029109
    • pmid31061061
    Epidemiology of stone disease across the world35World Journal of Urology13011320
    • doi10.1007/s00345-017-2008-6
    • pmid28213860
    The ABO blood group system revisited: a review and update25Immunohematology4859
    • pmid19927620
    Biologic roles of the ABH and Lewis histo-blood group antigens part I: infection and immunity114Vox Sanguinis426442
    • doi10.1111/vox.12787
    • pmid31070258
    Biologic roles of the ABH and Lewis histo-blood group antigens part II: thrombosis, cardiovascular disease and metabolism114Vox Sanguinis535552
    • doi10.1111/vox.12786
    • pmid31090093
    RhD haemolytic disease of the fetus and the newborn14Blood Reviews4461
    • doi10.1054/blre.1999.0123
    • pmid10805260
    ABO blood group and dementia risk--A scandinavian Record-Linkage study10PLOS ONE
    • doi10.1371/journal.pone.0129115
    • pmid26042891
    ABO blood group and risk of thromboembolic and arterial disease: a study of 1.5 million blood donors133Circulation14491457
    • doi10.1161/CIRCULATIONAHA.115.017563
    • pmid26939588
    ABO blood group and risk of Cancer: a register-based cohort study of 1.6 million blood donors44Cancer Epidemiology4043
    • doi10.1016/j.canep.2016.06.005
    • pmid27459465
    The swedish scandinavian donations and transfusions database (SCANDAT3‐S) – 50 years of donor and recipient follow‐up60Transfusion30193027
    • doi10.1111/trf.16027