Shu-yi Wei

My Blog

A MC Simulation of ABO Blood Group Evolution(血型演化)

By Shu-yi Wei, 02/04/2020 | 作者:魏树一


In the March, a group of researchers published a paper on preprint [1] on the investigation of the possible correlation between the ABO Blood Group and the COVID-19 Susceptibility. By comparing the blood group distribution of the 2173 patients in Wuhan in 2019-2020 with that of normal people in 2015, they found a significantly increased risk of blood group A for COVID-19 and a decreased risk of blood group O.

In my opinion, such study is quite problematic and the conclusion can not be regarded as solid. First, before the Wuhan lockdown, roughly half of the people have left for the Lunar-New-Year family reunion. Since they come from different proviences, the blood group distributions might be different. Second, not all the Wuhan residents are exposed to the virus. Normally such virus is spreading in several communities. A solid conclusion can only be obtained by comparing the blood group distributions of the infected people and of the exposed people. I have to admit, such study is extremely difficult, if not impossible, to achieve. Nonetheless, I am not going to propose a better research. I am just questioning their conclusion.

In this blog, I would like to build a toy Monte-Carlo Model to simulate the evolution of blood group distribution. This work is just to test my ability of coding a MC program.

Toy Model

(1) Given initial distribution. (2) The blood group distribution is gender-irrelevant. (3) Couples marry each other randomly (blood group neutral). (4) Divorce is prohibited. (5) Bigamy is no go. (6) Each couple will produce two kids whose genders are determined randomly.


(A) Initialize the blood group distribution of the first generation.

(B) Randomly determine which ones are going to be husbands and the rest would be wifes.

(C) Randomly marry husbands and wifes together and ask them to produce next generation.

(D) Determine the blood group distribution of next generation according to their parents.

(E) Repeat the above procedures several times.

Several Keypoints

(1) Generate random numbers:

First, put the iseed in the common block. Then we can use the x = ran(iseed) function to get a double precison random number between 0-1. We can also use K = 1 + int(10d0*ran(iseed)) to get a random integer between 1-10.

(2) Probability distribution of the next generation:

Parients: OO and OO; Next generation: OO (1).
Parients: AO and OO; Next generation: OO (0.5), AO(0.5).
Parients: AA and OO; Next generation: AO (1).
Parients: BO and OO; Next generation: OO (0.5), BO(0.5).
Parients: BB and OO; Next generation: BO (1).
Parients: AB and OO; Next generation: AO (0.5), BO(0.5).
Parients: AO and AO; Next generation: OO (0.25), AO(0.5), AA(0.25).
Parients: AA and AO; Next generation: AA (0.5), AO(0.5).
Parients: BO and AO; Next generation: OO (0.25), AO(0.25), BO(0.25), AB(0.25).
Parients: BB and AO; Next generation: AB (0.5), BO(0.5).
Parients: AB and AO; Next generation: AA (0.25), AO(0.25), BO(0.25), AB(0.25).
Parients: AA and AA; Next generation: AA (1).
Parients: BO and AA; Next generation: AB (0.5), AO(0.5).
Parients: BB and AA; Next generation: AB (1).
Parients: AB and AA; Next generation: AA (0.5), AB (0.5).
Parients: BO and BO; Next generation: BB (0.25), OO(0.25), BO(0.5).
Parients: BB and BO; Next generation: BB (0.5), BO(0.5).
Parients: AB and BO; Next generation: AB (0.25), AO(0.25), BO(0.25), BB(0.25).
Parients: BB and BB; Next generation: BB (1).
Parients: AB and BB; Next generation: AB (0.5), BB (0.5).
Parients: AB and AB; Next generation: AA (0.25), BB (0.25), AB (0.5).

Fortran Code

Click Here