#PRÁCTICA nº 2: Cálculo de la diferenciación genética y métodos de agrupación a partir de datos SNP
Introducción En esta viñeta, discutiremos cómo evaluar la estructura genética poblacional a partir de datos SNP a nivel poblacional. Estimaremos Fst por población, Fst por pares AMOVA (Fst jerárquica ). Finalmente evaluaremos la estructura genética a nivel individual asumiendo que no conocemos las poblaciones usando un análisis multivariante.
library("adegenet")
## Loading required package: ade4
##
## /// adegenet 2.1.10 is loaded ////////////
##
## > overview: '?adegenet'
## > tutorials/doc/questions: 'adegenetWeb()'
## > bug reports/feature requests: adegenetIssues()
library("hierfstat")
##
## Attaching package: 'hierfstat'
## The following objects are masked from 'package:adegenet':
##
## Hs, read.fstat
library("pegas")
## Loading required package: ape
##
## Attaching package: 'ape'
## The following objects are masked from 'package:hierfstat':
##
## pcoa, varcomp
## Registered S3 method overwritten by 'pegas':
## method from
## print.amova ade4
##
## Attaching package: 'pegas'
## The following object is masked from 'package:ape':
##
## mst
## The following object is masked from 'package:ade4':
##
## amova
Importar datos
Mydata <- read.table("D:/Gene_avan/Genetica de poblaciones/Practica/Master_Pinus_data_genotype.txt", header = T, check.names = FALSE)
dim(Mydata)
## [1] 550 3086
ind <- as.character(Mydata$tree_id) # use later with adegenet (individual labels)
population <- as.character(Mydata$state) # use later with adegenet (population labels)
county <- Mydata$county
dim(Mydata) # 550 individuals x 3082 SNPs
## [1] 550 3086
Conversión de datos Para convertir Mydata en un objeto “genind” (adegenet), la entrada sólo debe contener genotipos. Disminuimos el número de SNPs para que los cálculos sean más rápidos y mantenemos sólo 20 SNPs en el locus objeto. A continuación, convertimos Mydata1 en un objeto “hierfstat” (Mydata2).
locus <- Mydata[, 5:24]
Mydata1 <- df2genind(locus, ploidy = 2, ind.names = ind, pop = population, sep = "")
Mydata1
## /// GENIND OBJECT /////////
##
## // 550 individuals; 20 loci; 40 alleles; size: 141.5 Kb
##
## // Basic content
## @tab: 550 x 40 matrix of allele counts
## @loc.n.all: number of alleles per locus (range: 2-2)
## @loc.fac: locus factor for the 40 columns of @tab
## @all.names: list of allele names for each locus
## @ploidy: ploidy of each individual (range: 2-2)
## @type: codom
## @call: df2genind(X = locus, sep = "", ind.names = ind, pop = population,
## ploidy = 2)
##
## // Optional content
## @pop: population of each individual (group size range: 4-177)
Conversión final
Mydata2 <- genind2hierfstat(Mydata1)
Heterocigosidad observada y esperada: Fst Estos estadísticos proceden del paquete hierfstat.
basic.stats(Mydata1) # Fst following Nei (1987) on genind object
## $perloc
## Ho Hs Ht Dst Htp Dstp Fst Fstp
## X0.10037.01.257 0.4986 0.4079 0.4259 0.0180 0.4277 0.0198 0.0422 0.0462
## X0.10040.02.394 0.4866 0.4971 0.4968 -0.0003 0.4968 -0.0003 -0.0005 -0.0006
## X0.10044.01.392 0.3638 0.4232 0.4931 0.0699 0.5000 0.0768 0.1417 0.1537
## X0.10048.01.60 0.4261 0.4626 0.4953 0.0327 0.4986 0.0359 0.0660 0.0721
## X0.10051.02.166 0.0596 0.0613 0.0634 0.0020 0.0636 0.0023 0.0323 0.0354
## X0.10054.01.402 0.4584 0.4481 0.4761 0.0280 0.4789 0.0308 0.0588 0.0643
## X0.10067.03.111 0.0879 0.0853 0.0853 0.0000 0.0853 -0.0001 -0.0005 -0.0006
## X0.10079.02.168 0.0833 0.0808 0.0830 0.0022 0.0832 0.0024 0.0263 0.0288
## X0.10112.01.169 0.0764 0.0766 0.0760 -0.0006 0.0760 -0.0007 -0.0079 -0.0088
## X0.10113.01.119 0.4436 0.4331 0.4294 -0.0037 0.4290 -0.0041 -0.0087 -0.0095
## X0.10116.01.165 0.0399 0.0407 0.0402 -0.0004 0.0402 -0.0005 -0.0105 -0.0115
## X0.10151.01.86 0.1063 0.1113 0.1125 0.0012 0.1126 0.0013 0.0106 0.0116
## X0.10162.01.255 0.0863 0.0879 0.0862 -0.0018 0.0860 -0.0020 -0.0207 -0.0228
## X0.10207.01.280 0.2875 0.3521 0.3613 0.0092 0.3622 0.0101 0.0254 0.0279
## X0.10210.01.41 0.1081 0.1108 0.1089 -0.0019 0.1087 -0.0021 -0.0174 -0.0194
## X0.10219.01.433 0.3618 0.3648 0.3656 0.0009 0.3657 0.0009 0.0023 0.0026
## X0.1022.02.173 0.4346 0.4267 0.4490 0.0222 0.4512 0.0245 0.0495 0.0542
## X0.10240.01.410 0.4576 0.4530 0.5006 0.0477 0.5054 0.0524 0.0952 0.1037
## X0.10262.01.558 0.2256 0.2292 0.2305 0.0013 0.2306 0.0014 0.0055 0.0060
## X0.10266.01.426 0.0677 0.0720 0.0716 -0.0004 0.0715 -0.0005 -0.0059 -0.0064
## Fis Dest
## X0.10037.01.257 -0.2224 0.0334
## X0.10040.02.394 0.0210 -0.0006
## X0.10044.01.392 0.1403 0.1332
## X0.10048.01.60 0.0790 0.0669
## X0.10051.02.166 0.0286 0.0024
## X0.10054.01.402 -0.0229 0.0558
## X0.10067.03.111 -0.0293 -0.0001
## X0.10079.02.168 -0.0308 0.0026
## X0.10112.01.169 0.0036 -0.0007
## X0.10113.01.119 -0.0243 -0.0072
## X0.10116.01.165 0.0193 -0.0005
## X0.10151.01.86 0.0443 0.0015
## X0.10162.01.255 0.0192 -0.0021
## X0.10207.01.280 0.1834 0.0156
## X0.10210.01.41 0.0245 -0.0024
## X0.10219.01.433 0.0082 0.0015
## X0.1022.02.173 -0.0185 0.0427
## X0.10240.01.410 -0.0102 0.0958
## X0.10262.01.558 0.0160 0.0018
## X0.10266.01.426 0.0591 -0.0005
##
## $overall
## Ho Hs Ht Dst Htp Dstp Fst Fstp Fis Dest
## 0.2580 0.2612 0.2725 0.0113 0.2737 0.0124 0.0415 0.0454 0.0124 0.0168
wc(Mydata1) # Weir and Cockerham's estimate
## $FST
## [1] 0.02300324
##
## $FIS
## [1] 0.03090781
Pruebas Fst jerárquicas (=AMOVA para conjunto de datos SNP) La función varcomp.glob() produce un Fst Jerárquico (=AMOVA para SNPs o marcadores bialélicos) Es posible hacer permutaciones en los diferentes niveles: La función test.g() comprueba el efecto de la población en la diferenciación genética. Los individuos se permutan aleatoriamente entre estados. Los estados influyen en la diferenciación genética a un nivel del 5%. Con la función test.between(), los condados se permutan entre estados. Los estados influyen significativamente en la estructuración genética.
loci <- Mydata2[, -1] # Remove the population column
varcomp.glob(levels = data.frame(population, county), loci, diploid = TRUE)
## $loc
## [,1] [,2] [,3] [,4]
## X0.10037.01.257 4.631785e-03 -0.0075801286 -0.0110876895 0.42329020
## X0.10040.02.394 -3.927184e-06 0.0057909958 0.0035980465 0.48979592
## X0.10044.01.392 1.276810e-02 0.0039247749 0.0247870243 0.46198830
## X0.10048.01.60 6.490717e-03 0.0189152357 0.0255163684 0.39741220
## X0.10051.02.166 2.977513e-03 0.0037478140 -0.0001317105 0.11970534
## X0.10054.01.402 1.806575e-02 -0.0002977277 0.0134753262 0.47329650
## X0.10067.03.111 9.490247e-04 -0.0022733109 0.0022479222 0.07339450
## X0.10079.02.168 1.359482e-03 0.0015693361 -0.0020878338 0.07692308
## X0.10112.01.169 5.570862e-04 -0.0011207466 -0.0022195075 0.11151737
## X0.10113.01.119 -3.038733e-03 0.0190331181 -0.0321043585 0.45871560
## X0.10116.01.165 -4.102906e-04 0.0010983394 0.0019041211 0.04204753
## X0.10151.01.86 1.180089e-03 0.0038425248 0.0163965166 0.14180479
## X0.10162.01.255 2.762257e-04 0.0025535687 -0.0007521869 0.09778598
## X0.10207.01.280 2.419336e-02 0.0016539601 0.0286306732 0.38051471
## X0.10210.01.41 -1.206136e-03 0.0040434594 0.0069081606 0.09775967
## X0.10219.01.433 2.608653e-03 0.0035115484 0.0048812171 0.30755064
## X0.1022.02.173 7.258406e-03 0.0006657100 -0.0222437933 0.41198502
## X0.10240.01.410 3.603309e-02 0.0212763776 0.0035015937 0.41263941
## X0.10262.01.558 5.048435e-04 -0.0006787502 0.0310839391 0.15201465
## X0.10266.01.426 -7.102129e-04 0.0020016810 0.0053850735 0.11151737
##
## $overall
## population county Ind Error
## 0.11448482 0.08167778 0.09768890 5.24165877
##
## $F
## population county Ind
## Total 0.02068189 0.03543713 0.05308481
## population 0.00000000 0.01506685 0.03308722
## county 0.00000000 0.00000000 0.01829604
test.g(loci, level = population)
## $g.star
## [1] 205.0137 261.2203 240.0722 204.4959 217.7883 232.8068 225.4453 219.3582
## [9] 228.3732 244.3867 247.1552 233.3499 205.4381 206.9693 265.6322 194.8710
## [17] 244.1548 239.5045 204.1266 228.7004 229.0208 206.4280 197.9791 227.7793
## [25] 201.9512 264.5635 213.7352 227.8742 235.4000 203.4867 208.4111 223.6889
## [33] 225.0723 259.9158 222.9178 222.1141 185.9082 247.8932 203.5019 210.8898
## [41] 241.0161 226.1597 202.5719 228.1248 264.4577 246.7554 263.5900 189.8385
## [49] 236.2845 218.3503 218.9117 252.6959 231.3135 227.5882 216.1272 246.3573
## [57] 251.3572 247.2888 237.5621 182.3552 203.8249 184.6740 220.7069 225.4622
## [65] 249.3244 202.1369 239.8745 212.6512 197.9028 206.8366 251.7288 183.8597
## [73] 219.2770 231.4649 228.2586 221.6990 202.8121 215.1941 192.5580 178.9972
## [81] 206.8197 214.8628 191.6519 230.3396 238.4507 208.7480 226.9017 217.6387
## [89] 221.2079 220.1301 209.7764 254.0793 208.0785 259.4231 218.2337 212.3895
## [97] 229.5584 240.9149 221.9940 378.7654
##
## $p.val
## [1] 0.01
test.between(loci, test.lev = population, rand.unit = county, nperm = 100)
## $g.star
## [1] 226.3518 216.3278 240.2997 234.4399 259.3469 207.5079 263.4204 275.9181
## [9] 280.7377 265.6555 260.3884 252.8274 234.4215 288.0257 229.2636 258.8305
## [17] 252.5587 273.5986 240.7157 268.7078 272.8535 232.9686 276.0974 305.5461
## [25] 262.9456 218.3979 294.4636 265.8197 262.4904 254.2350 266.8151 249.1796
## [33] 242.5928 291.3419 265.8925 298.4618 240.2064 225.4393 297.7730 263.5586
## [41] 294.0938 267.5754 236.3846 295.2488 255.8374 251.7269 248.8596 246.8049
## [49] 294.0309 235.1101 259.8851 235.1804 270.5308 276.7476 269.6473 269.8785
## [57] 211.6253 242.6638 271.4075 269.9564 215.6159 238.1041 279.8214 294.0705
## [65] 240.7484 233.9395 310.6488 279.7521 245.6695 253.1752 215.4911 270.7321
## [73] 271.6947 233.7996 263.3020 275.6045 256.5686 266.6917 242.6900 296.5988
## [81] 279.0743 267.6146 289.4335 225.1005 280.2719 228.8582 228.6465 257.9564
## [89] 261.4010 243.5127 286.9465 225.0518 273.9091 262.8850 299.5269 280.7104
## [97] 268.1913 215.2070 261.4161 378.7654
##
## $p.val
## [1] 0.01
Fst por pares
genet.dist(Mydata1, method = "WC84")
## georgia virginia northcarolina southcarolina
## virginia 0.014916721
## northcarolina 0.035531517 0.012476717
## southcarolina 0.029831181 0.009878778 0.006809538
## alabama 0.046469226 0.027303304 0.009066562 0.007107402
## oklahoma 0.092718257 0.125242248 0.116089566 0.107662986
## arkansas 0.028847476 0.065029859 0.057810705 0.052707863
## florida 0.001379763 0.027697122 0.033602798 0.019836955
## mississippi 0.018627828 0.034121040 0.030048967 0.030695068
## texas 0.046361901 0.068423280 0.046659978 0.052491099
## louisiana 0.133824385 0.092337839 0.043365828 0.064729942
## alabama oklahoma arkansas florida mississippi
## virginia
## northcarolina
## southcarolina
## alabama
## oklahoma 0.104844418
## arkansas 0.052033165 0.022743098
## florida 0.034205805 0.080741693 0.031222010
## mississippi 0.019629941 0.061834123 -0.011045367 0.008707686
## texas 0.038153327 0.033860376 0.013982640 0.025059824 -0.025535193
## louisiana 0.031028123 0.070815392 0.035722729 0.096253248 0.030209963
## texas
## virginia
## northcarolina
## southcarolina
## alabama
## oklahoma
## arkansas
## florida
## mississippi
## texas
## louisiana 0.036298136
Agrupación no supervisada No conocemos las poblaciones que buscamos. Como recomienda T. Jombart, con la función find.clusters() utilizamos el máximo número posible de ejes PCA que aquí es 20. Ver tutorial detallado sobre este método para más información (https://github.com/thibautjombart/adegenet/raw/master/tutorials /tutorial-basics.pdf) En este ejemplo, hemos utilizado choose.n.clust = FALSE pero es bueno utilizar la opción TRUE y entonces usted será capaz de elegir el número de clusters
# using Kmeans and DAPC in adegenet
set.seed(20160308) # Setting a seed for a consistent result
grp <- find.clusters(Mydata1, max.n.clust = 10, n.pca = 20, choose.n.clust = FALSE)
names(grp)
## [1] "Kstat" "stat" "grp" "size"
grp$grp
## 1066 2040 4004 4005 4018 6009 6013 7033 7056 7069 7088
## 1 1 2 1 1 1 2 2 2 2 1
## 7105 8001 8061 8068 8076 8120 8195 8203 8222 8223 8231
## 2 1 1 1 1 1 1 1 2 1 1
## 8237 8301 8302 8303 8304 8305 8307 8308 8309 8310 8313
## 2 1 1 1 1 2 2 1 1 1 1
## 8314 8316 8317 8318 8319 8320 8323 8324 8327 8328 8329
## 1 1 1 2 1 1 1 1 1 2 1
## 8330 8332 8333 8334 8335 8336 8337 8338 8339 8340 8342
## 2 1 1 2 1 2 2 2 1 1 1
## 8343 8344 8345 8346 8347 8349 8350 8351 8352 8353 8354
## 1 1 1 1 2 1 1 1 1 2 1
## 8355 8356 8357 8358 8364 8365 8366 8367 8368 8369 8370
## 1 1 1 1 1 1 1 2 1 1 1
## 8371 8372 8373 8374 8375 8376 8377 8378 8379 8381 8382
## 1 1 1 1 2 2 1 1 1 2 1
## 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393
## 2 2 2 1 1 2 1 1 2 2 2
## 8395 8400 8402 8403 8559 8565 8567 8568 8569 8570 8571
## 2 1 2 2 1 2 2 2 1 1 1
## 8572 8573 8574 8601 8602 8603 8604 8606 8607 8608 8609
## 2 1 1 1 1 2 2 2 1 1 1
## 8610 8611 8613 8615 8616 8618 8619 8620 8621 8622 8624
## 2 1 2 2 1 2 2 1 2 1 2
## 8626 8628 8629 8630 8631 8633 8634 8635 8636 8637 8638
## 2 1 1 1 1 1 2 1 2 1 1
## 8639 8640 8641 8642 8643 8644 8645 8646 8647 8648 8651
## 2 2 2 1 2 1 2 1 2 1 1
## 8652 8653 8654 8655 8656 8657 8658 8659 8660 8661 8662
## 1 1 1 2 1 2 1 1 1 1 2
## 8663 8664 8667 8669 8670 8671 8672 8673 8674 8675 8676
## 1 2 1 1 2 1 2 2 2 1 1
## 8677 8678 8679 8680 8683 8685 8686 8687 8688 8689 8691
## 1 2 2 1 2 2 1 2 1 1 2
## 8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702
## 2 2 1 2 2 2 2 1 2 1 1
## 8703 8704 8705 8706 9003 9006 9015 10005 11010 11503 11532
## 2 1 2 2 1 1 2 1 1 1 2
## 12008 12012 14010 14015 22212 68087 68088 68090 68095 68130 68131
## 2 1 2 1 1 1 1 2 2 1 2
## 68133 68134 68135 105A 108A 109B 110B 112C 115B 117B 118B
## 1 1 1 2 2 1 1 1 1 1 2
## 11A 120A 121C 127A 128A 131B 132B 136C 138A 139B 140B
## 1 1 1 2 2 2 2 2 1 2 2
## 141A 142B 144C 145A 146C 147A 149B 150A 151A 152B 153B
## 2 2 2 2 1 2 2 1 2 2 2
## 154C 155B 156C 157A 158B 15A 162A 166B 16A 171A 173A
## 2 2 1 2 1 1 1 2 1 1 2
## 174A 17C 188A 189A 190A 191A 19A 205B 20A 212A 213A
## 2 2 1 2 2 2 2 2 2 1 1
## 217C 219A 21A 220A 224A 226C 227C 234B 235A 238A 23A
## 2 1 2 1 1 2 2 1 2 2 2
## 245B 248A 250C 253A 254C 257B 258A 260B 262A 264C 265A
## 1 2 1 1 2 1 2 2 1 1 1
## 268A 269A 270C 271A 272B 275A 276B 277A 27A 281A 282B
## 1 1 2 2 1 2 1 2 1 1 2
## 283C 285C 286B 287C 288C 289A 290C 291C 292C 298B 299C
## 1 1 2 1 1 2 2 1 1 2 1
## 300C 302A 303C 305A 306A 307A 311A 316B 320C 322A 323B
## 2 2 1 2 1 2 1 2 2 1 2
## 324A 326A 327A 328B 329B 32A 330A 331B 332C 334A 335A
## 1 2 1 2 2 2 2 2 2 2 1
## 336A 339B 340A 341C 346A 349B 34A 351A 353C 355A 35A
## 2 2 1 1 2 1 2 2 2 1 1
## 360B 361B 362C 365B 366A 368B 369A 36A 370C 371B 372A
## 2 2 1 1 1 2 2 1 2 1 1
## 373B 375A 377B 378B 379B 382A 383C 384A 385B 387A 388B
## 1 2 2 2 2 2 2 2 2 1 1
## 389A 390B 391C 392A 393C 395A 397A 398C 400C 407A 408C
## 1 1 2 2 2 2 2 1 1 2 2
## 409B 410A 411C 412C 414A 415A 416B 417A 418A 419B 41C
## 2 1 2 2 2 2 1 2 1 1 2
## 420B 421A 422B 423C 424B 425B 426B 427C 428C 429B 42A
## 1 2 1 1 1 1 2 2 1 1 2
## 430B 431B 433B 434B 435C 436A 43B 441C 442C 443C 448C
## 2 2 1 2 2 2 1 2 1 1 1
## 449A 450B 451B 459A 461A 463A 469C 470A 471B 481A 483A
## 2 1 1 2 2 1 1 2 2 1 1
## 484A 485A 486B 487C 489B 48B 492C 493A 496B 498B 499A
## 1 1 1 1 2 2 1 1 2 1 2
## 49A 500B 501A 502C 514A 515A 519B 520B 526A 527B 528C
## 2 1 2 2 2 1 2 1 2 1 2
## 52A 531A 532A 533A 534A 535C 536A 539A 53C 540A 541A
## 2 2 2 2 1 1 2 2 2 2 2
## 542C 543C 544B 545A 546C 548C 549A 54C 551C 552A 553B
## 2 2 1 2 1 2 2 1 1 1 2
## 554A 555C 556A 557B 558A 559A 55A 561A 562A 563A 564B
## 1 2 2 2 2 2 2 2 2 2 2
## 565C 566B 568B 570A 571A 572C 573C 574B 576A 577B 578B
## 1 2 1 1 2 2 2 2 2 2 2
## 579A 57A 580A 581C 600A 601A 603A 605B 606B 60A 612C
## 1 2 2 1 1 2 1 1 1 1 1
## 613A 618A 619A 61A 620C 621A 633B 634C 635A 636C 637B
## 1 2 2 1 1 1 1 2 1 1 1
## 63B 644B 645A 646A 66A 67C 69A 73B 77B 7A 86C
## 1 1 1 1 2 2 2 1 2 1 1
## 89C 90C 92A 93C 94C 97B 98A 99C 9A CRO108 CRO120
## 1 2 2 2 2 1 1 2 2 2 1
## CRO121 CRO133 DF3364 FM406 FM417 FM428 FM442 FM445 S4PT6 SH13 SH7
## 1 1 1 1 1 2 1 2 1 2 1
## Levels: 1 2
El procedimiento de medias K detectó 4 grupos. Utilizaremos este número de grupo en el análisis discriminante (función dapc()). En su propio conjunto de datos, tendrá que dedicar más tiempo a estimar el número de grupos.
dapc1 <- dapc(Mydata1, grp$grp, n.pca = 20, n.da = 6)
scatter(dapc1) # plot of the group
Está claro que un subconjunto de 20 SNP no tiene una señal lo
suficientemente fuerte como para separar las muestras en grupos
distintos. ¿Qué pasaría si utilizáramos más SNPs?
Conclusiones ¿Qué hemos aprendido hoy? En esta viñeta, aprendimos a calcular Fst en poblaciones existentes y a investigar el efecto de la estructura de la población en la diferenciación genética a partir del análisis Fst jerárquico (como AMOVA en el caso de SNP). También ejecutamos un análisis multivariante para investigar la estructura genética de los datos a nivel individual asumiendo que no hay estructura poblacional.
Traducción realizada con la versión gratuita del traductor www.DeepL.com/Translator