This document will demonstrate the quantitative genetic of heterosis and show heterosis in an example maize simulation.

Quantitative genetics of heterosis

The below simulation will show different types of heterosis presented in the Labroo et. al. figure.

library(AlphaSimR)
Loading required package: R6
# Adding a split in coalescent simulation to model 2 populations that
# diverge 100 generations ago
founderPop = runMacs(nInd=200, nChr=10, segSites=1000, 
                     split=100)

SP = SimParam$
  new(founderPop[1:100])$
  addTraitAD(1000, meanDD=0.2, varDD=0.1)

# Splitting the two populations in founderPop into two separate populations
A = newPop(founderPop[1:100])
B = newPop(founderPop[101:200])

# Creating fully inbred versions of the two populations
A_inbred = makeDH(A)
B_inbred = makeDH(B)

# Creating an F1 hybrids between populations A and B
F1 = hybridCross(A, B)

# Creating F1 hybrids using the inbred populations
F1_inbred = hybridCross(A_inbred, B_inbred)

# Creating an F2 population by random mating the F1s
F2 = randCross(F1, nCrosses=10000)

# Examine the means of the initial populations
meanG(A)
       Trait1 
-2.036704e-15 
meanG(B)
   Trait1 
-1.645001 
# Examing the means of the inbred populations
meanG(A_inbred)
   Trait1 
-7.329905 
meanG(B_inbred)
   Trait1 
-8.700199 
# Examine the means of the F1 populations
# They should be approximately equivalent
meanG(F1)
  Trait1 
3.636628 
meanG(F1_inbred)
  Trait1 
3.624459 
# Examining mean of F2
meanG(F2)
  Trait1 
1.350998 
# Panmictic Midparent Heterosis
meanG(F1) - (meanG(A)+meanG(B))/2
  Trait1 
4.459129 
# Inbred Midparent Heterosis
meanG(F1) - (meanG(A_inbred)+meanG(B_inbred))/2
  Trait1 
11.65168 
# Baseline Heterosis
(meanG(A)+meanG(B))/2 - (meanG(A_inbred)+meanG(B_inbred))/2
  Trait1 
7.192552 
# F2 Heterosis (about half of panmictic midparent heterosis)
meanG(F2) - (meanG(A)+meanG(B))/2
  Trait1 
2.173499 
## Extra not in heterosis figure

# Create F2 by selfing F1
F2_self = self(F1)

# Selfing removes half of inbred midparent heterosis
meanG(F2_self) - (meanG(A_inbred)+meanG(B_inbred))/2
  Trait1 
5.852955 

Maize example

The below script simulates a maize population using parameters determined by after tuning. It will also show the correlation between per se and testcross performance.

founderPop = runMacs(nInd=200, nChr=10, segSites=300, 
                     split=100, species="MAIZE", inbred=TRUE)

SP = SimParam$
  new(founderPop[1:100])$
  addTraitAD(300, 
             mean=70, # Bushels per acre 
             var=20, # Inbred variance
             meanDD=0.92, 
             varDD=0.3)$
  setVarE(H2=1)

# Create inbred populations
A = newPop(founderPop[1:100])
B = newPop(founderPop[101:200])

# Create all possible hybrids
F1 = hybridCross(A, B)

# Examine means of populations
meanG(A)
Trait1 
    70 
meanG(B)
  Trait1 
73.53552 
meanG(F1)
  Trait1 
160.3342 
# Examine variances
varG(A)
       Trait1
Trait1     20
varG(B)
         Trait1
Trait1 21.92027
varG(F1)
         Trait1
Trait1 22.16816
# Calculating GCA using built-in functions and measuring
# GCA - per se correlation
GCA = calcGCA(F1, use="gv")

head(GCA$GCAf)

cor(GCA$GCAf[,2], gv(A))
        Trait1
[1,] 0.8069501
cor(GCA$GCAm[,2], gv(B))
        Trait1
[1,] 0.8201194
# Testcross with 1 tester

A = setPhenoGCA(A, testers=B[1])
B = setPhenoGCA(B, tester=A[1])

cor(GCA$GCAf[,2], pheno(A))
        Trait1
[1,] 0.8646758
cor(GCA$GCAm[,2], pheno(B))
        Trait1
[1,] 0.8487118
# Testcross with 3 testers

A = setPhenoGCA(A, testers=B[1:3])
B = setPhenoGCA(B, tester=A[1:3])

cor(GCA$GCAf[,2], pheno(A))
          [,1]
[1,] 0.9306472
cor(GCA$GCAm[,2], pheno(B))
          [,1]
[1,] 0.9299701
LS0tDQp0aXRsZTogIlF1YW50aXRhdGl2ZSBHZW5ldGljczogRG9taW5hbmNlIEVmZmVjdHMsIFBhcnQgMiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoaXMgZG9jdW1lbnQgd2lsbCBkZW1vbnN0cmF0ZSB0aGUgcXVhbnRpdGF0aXZlIGdlbmV0aWMgb2YgaGV0ZXJvc2lzIGFuZCBzaG93IGhldGVyb3NpcyBpbiBhbiBleGFtcGxlIG1haXplIHNpbXVsYXRpb24uDQoNCiMjIFF1YW50aXRhdGl2ZSBnZW5ldGljcyBvZiBoZXRlcm9zaXMNCg0KVGhlIGJlbG93IHNpbXVsYXRpb24gd2lsbCBzaG93IGRpZmZlcmVudCB0eXBlcyBvZiBoZXRlcm9zaXMgcHJlc2VudGVkIGluIHRoZSBMYWJyb28gZXQuIGFsLiBmaWd1cmUuDQoNCmBgYHtyfQ0KbGlicmFyeShBbHBoYVNpbVIpDQoNCiMgQWRkaW5nIGEgc3BsaXQgaW4gY29hbGVzY2VudCBzaW11bGF0aW9uIHRvIG1vZGVsIDIgcG9wdWxhdGlvbnMgdGhhdA0KIyBkaXZlcmdlIDEwMCBnZW5lcmF0aW9ucyBhZ28NCmZvdW5kZXJQb3AgPSBydW5NYWNzKG5JbmQ9MjAwLCBuQ2hyPTEwLCBzZWdTaXRlcz0xMDAwLCANCiAgICAgICAgICAgICAgICAgICAgIHNwbGl0PTEwMCkNCg0KU1AgPSBTaW1QYXJhbSQNCiAgbmV3KGZvdW5kZXJQb3BbMToxMDBdKSQNCiAgYWRkVHJhaXRBRCgxMDAwLCBtZWFuREQ9MC4yLCB2YXJERD0wLjEpDQoNCiMgU3BsaXR0aW5nIHRoZSB0d28gcG9wdWxhdGlvbnMgaW4gZm91bmRlclBvcCBpbnRvIHR3byBzZXBhcmF0ZSBwb3B1bGF0aW9ucw0KQSA9IG5ld1BvcChmb3VuZGVyUG9wWzE6MTAwXSkNCkIgPSBuZXdQb3AoZm91bmRlclBvcFsxMDE6MjAwXSkNCg0KIyBDcmVhdGluZyBmdWxseSBpbmJyZWQgdmVyc2lvbnMgb2YgdGhlIHR3byBwb3B1bGF0aW9ucw0KQV9pbmJyZWQgPSBtYWtlREgoQSkNCkJfaW5icmVkID0gbWFrZURIKEIpDQoNCiMgQ3JlYXRpbmcgYW4gRjEgaHlicmlkcyBiZXR3ZWVuIHBvcHVsYXRpb25zIEEgYW5kIEINCkYxID0gaHlicmlkQ3Jvc3MoQSwgQikNCg0KIyBDcmVhdGluZyBGMSBoeWJyaWRzIHVzaW5nIHRoZSBpbmJyZWQgcG9wdWxhdGlvbnMNCkYxX2luYnJlZCA9IGh5YnJpZENyb3NzKEFfaW5icmVkLCBCX2luYnJlZCkNCg0KIyBDcmVhdGluZyBhbiBGMiBwb3B1bGF0aW9uIGJ5IHJhbmRvbSBtYXRpbmcgdGhlIEYxcw0KRjIgPSByYW5kQ3Jvc3MoRjEsIG5Dcm9zc2VzPTEwMDAwKQ0KDQojIEV4YW1pbmUgdGhlIG1lYW5zIG9mIHRoZSBpbml0aWFsIHBvcHVsYXRpb25zDQptZWFuRyhBKQ0KbWVhbkcoQikNCg0KIyBFeGFtaW5nIHRoZSBtZWFucyBvZiB0aGUgaW5icmVkIHBvcHVsYXRpb25zDQptZWFuRyhBX2luYnJlZCkNCm1lYW5HKEJfaW5icmVkKQ0KDQojIEV4YW1pbmUgdGhlIG1lYW5zIG9mIHRoZSBGMSBwb3B1bGF0aW9ucw0KIyBUaGV5IHNob3VsZCBiZSBhcHByb3hpbWF0ZWx5IGVxdWl2YWxlbnQNCm1lYW5HKEYxKQ0KbWVhbkcoRjFfaW5icmVkKQ0KDQojIEV4YW1pbmluZyBtZWFuIG9mIEYyDQptZWFuRyhGMikNCg0KIyBQYW5taWN0aWMgTWlkcGFyZW50IEhldGVyb3Npcw0KbWVhbkcoRjEpIC0gKG1lYW5HKEEpK21lYW5HKEIpKS8yDQoNCiMgSW5icmVkIE1pZHBhcmVudCBIZXRlcm9zaXMNCm1lYW5HKEYxKSAtIChtZWFuRyhBX2luYnJlZCkrbWVhbkcoQl9pbmJyZWQpKS8yDQoNCiMgQmFzZWxpbmUgSGV0ZXJvc2lzDQoobWVhbkcoQSkrbWVhbkcoQikpLzIgLSAobWVhbkcoQV9pbmJyZWQpK21lYW5HKEJfaW5icmVkKSkvMg0KDQojIEYyIEhldGVyb3NpcyAoYWJvdXQgaGFsZiBvZiBwYW5taWN0aWMgbWlkcGFyZW50IGhldGVyb3NpcykNCm1lYW5HKEYyKSAtIChtZWFuRyhBKSttZWFuRyhCKSkvMg0KDQoNCiMjIEV4dHJhIG5vdCBpbiBoZXRlcm9zaXMgZmlndXJlDQoNCiMgQ3JlYXRlIEYyIGJ5IHNlbGZpbmcgRjENCkYyX3NlbGYgPSBzZWxmKEYxKQ0KDQojIFNlbGZpbmcgcmVtb3ZlcyBoYWxmIG9mIGluYnJlZCBtaWRwYXJlbnQgaGV0ZXJvc2lzDQptZWFuRyhGMl9zZWxmKSAtIChtZWFuRyhBX2luYnJlZCkrbWVhbkcoQl9pbmJyZWQpKS8yDQoNCmBgYA0KDQoNCiMjIE1haXplIGV4YW1wbGUNCg0KVGhlIGJlbG93IHNjcmlwdCBzaW11bGF0ZXMgYSBtYWl6ZSBwb3B1bGF0aW9uIHVzaW5nIHBhcmFtZXRlcnMgZGV0ZXJtaW5lZCBieSBhZnRlciB0dW5pbmcuIEl0IHdpbGwgYWxzbyBzaG93IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHBlciBzZSBhbmQgdGVzdGNyb3NzIHBlcmZvcm1hbmNlLg0KDQpgYGB7cn0NCmZvdW5kZXJQb3AgPSBydW5NYWNzKG5JbmQ9MjAwLCBuQ2hyPTEwLCBzZWdTaXRlcz0zMDAsIA0KICAgICAgICAgICAgICAgICAgICAgc3BsaXQ9MTAwLCBzcGVjaWVzPSJNQUlaRSIsIGluYnJlZD1UUlVFKQ0KDQpTUCA9IFNpbVBhcmFtJA0KICBuZXcoZm91bmRlclBvcFsxOjEwMF0pJA0KICBhZGRUcmFpdEFEKDMwMCwgDQogICAgICAgICAgICAgbWVhbj03MCwgIyBCdXNoZWxzIHBlciBhY3JlIA0KICAgICAgICAgICAgIHZhcj0yMCwgIyBJbmJyZWQgdmFyaWFuY2UNCiAgICAgICAgICAgICBtZWFuREQ9MC45MiwgDQogICAgICAgICAgICAgdmFyREQ9MC4zKSQNCiAgc2V0VmFyRShIMj0xKQ0KDQojIENyZWF0ZSBpbmJyZWQgcG9wdWxhdGlvbnMNCkEgPSBuZXdQb3AoZm91bmRlclBvcFsxOjEwMF0pDQpCID0gbmV3UG9wKGZvdW5kZXJQb3BbMTAxOjIwMF0pDQoNCiMgQ3JlYXRlIGFsbCBwb3NzaWJsZSBoeWJyaWRzDQpGMSA9IGh5YnJpZENyb3NzKEEsIEIpDQoNCiMgRXhhbWluZSBtZWFucyBvZiBwb3B1bGF0aW9ucw0KbWVhbkcoQSkNCm1lYW5HKEIpDQptZWFuRyhGMSkNCg0KIyBFeGFtaW5lIHZhcmlhbmNlcw0KdmFyRyhBKQ0KdmFyRyhCKQ0KdmFyRyhGMSkNCg0KIyBDYWxjdWxhdGluZyBHQ0EgdXNpbmcgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtZWFzdXJpbmcNCiMgR0NBIC0gcGVyIHNlIGNvcnJlbGF0aW9uDQpHQ0EgPSBjYWxjR0NBKEYxLCB1c2U9Imd2IikNCg0KaGVhZChHQ0EkR0NBZikNCg0KY29yKEdDQSRHQ0FmWywyXSwgZ3YoQSkpDQoNCmNvcihHQ0EkR0NBbVssMl0sIGd2KEIpKQ0KDQojIFRlc3Rjcm9zcyB3aXRoIDEgdGVzdGVyDQoNCkEgPSBzZXRQaGVub0dDQShBLCB0ZXN0ZXJzPUJbMV0pDQpCID0gc2V0UGhlbm9HQ0EoQiwgdGVzdGVyPUFbMV0pDQoNCmNvcihHQ0EkR0NBZlssMl0sIHBoZW5vKEEpKQ0KY29yKEdDQSRHQ0FtWywyXSwgcGhlbm8oQikpDQoNCiMgVGVzdGNyb3NzIHdpdGggMyB0ZXN0ZXJzDQoNCkEgPSBzZXRQaGVub0dDQShBLCB0ZXN0ZXJzPUJbMTozXSkNCkIgPSBzZXRQaGVub0dDQShCLCB0ZXN0ZXI9QVsxOjNdKQ0KDQpjb3IoR0NBJEdDQWZbLDJdLCBwaGVubyhBKSkNCmNvcihHQ0EkR0NBbVssMl0sIHBoZW5vKEIpKQ0KYGBgDQoNCg==