Library Loading

library(vcfR)

   *****       ***   vcfR   ***       *****
   This is vcfR 1.13.0 
     browseVignettes('vcfR') # Documentation
     citation('vcfR') # Citation
   *****       *****      *****       *****
library(vegan)
Loading required package: permute
Loading required package: lattice
This is vegan 2.6-4
library(ggplot2)
library(ggpubr)

Confirm WD and vcf location

getwd()
[1] "/Users/james"
list.files(pattern = "vcf")
[1] "vcfR_test.vcf"    "vcfR_test.vcf.gz"

##Set SNP data for R

my_vcf <- "8.21122256-21362256.ALL.chr8_GRCh38.genotypes.20170504.vcf.gz"
vcf <- vcfR::read.vcfR(my_vcf, convertNA = TRUE)
Scanning file to determine attributes.
File attributes:
  meta lines: 130
  header_line: 131
  variant count: 8991
  column count: 2513

Meta line 130 read in.
All meta lines processed.
gt matrix initialized.
Character matrix gt created.
  Character matrix gt rows: 8991
  Character matrix gt cols: 2513
  skip: 0
  nrows: 8991
  row_num: 0

Processed variant 1000
Processed variant 2000
Processed variant 3000
Processed variant 4000
Processed variant 5000
Processed variant 6000
Processed variant 7000
Processed variant 8000
Processed variant: 8991
All variants processed

Converting raw VCF to Genotype Scores and save as csv

vcf_num <- vcfR::extract.gt(vcf,
                            element = "GT",
                            IDtoRowNames = F,
                            as.numeric = T,
                            convertNA = T)

Transposing and DataFraming and save it as csv

vcf_num_t <- t(vcf_num)

## make into a dataframe
vcf_num_df <- data.frame(vcf_num_t)

## get person (sample) names
sample <- row.names(vcf_num_df)

## Add sample into dataframe
vcf_num_df <- data.frame(sample,
                         vcf_num_df)

Clean Data

pop_meta <- read.csv(file = "1000genomes_people_info2-1.csv")

names(pop_meta)
[1] "pop"       "super_pop" "sample"    "sex"       "lat"       "lng"      
names(vcf_num_df)[1:10]
 [1] "sample" "X1"     "X2"     "X3"     "X4"     "X5"     "X6"     "X7"     "X8"     "X9"    
vcf_num_df2 <- merge(pop_meta,
                     vcf_num_df,
                     by = "sample")

write.csv(vcf_num_df2, file = "vcf_num_df2.csv", row.names = F)

Omit Invariant Features

## function
invar_omit <- function(x){
  cat("Dataframe of dim",dim(x), "processed...\n")
  sds <- apply(x, 2, sd, na.rm = TRUE)
  i_var0 <- which(sds == 0)
 
  
  cat(length(i_var0),"columns removed\n")
  
  if(length(i_var0) > 0){
     x <- x[, -i_var0]
  }
  
  ## add return()  with x in it
  return(x)     
}

vcf_noinvar <- vcf_num_df2
vcf_noinvar[, -c(1:6)] <- invar_omit(vcf_noinvar[, -c(1:6)])
Dataframe of dim 2504 8991 processed...
2208 columns removed
my_meta_N_invar_cols <- 2208

Remove Low-Quality

remove rows or SNPs with many NAs

find_NAs <- function(x){
  NAs_TF <-  is.na(x)
  i_NA <- which(NAs_TF == TRUE)
  N_NA <- length(i_NA)
  
  return(i_NA)
}

N_rows <- nrow(vcf_noinvar)

N_NA <- rep(x = 0, times = N_rows)

N_SNPs <- ncol(vcf_noinvar)

##for loop to search for NAs

for (i in 1:N_rows){
  i_NA <- find_NAs(vcf_noinvar[i,])
  N_NA_i <- length(i_NA)
  N_NA[i] <- N_NA_i
  }

Check if any rows has >50% NAs

cutoff50 <- N_SNPs*0.5
percent_NA <- N_NA/N_SNPs*100
any(percent_NA > 50)
[1] FALSE
my_meta_N_invar_rows <- mean(percent_NA)

Imputation of NAs

mean_imputation <- function(df){
  n_cols <- ncol(df)
  
  for(i in 1:n_cols){
    column_i <- df[, i]
    
    mean_i <- mean(column_i, na.rm = TRUE)
    
    NAs_i <- which(is.na(column_i))
    
    N_NAs <- length(NAs_i)
    
    column_i[NAs_i] <- mean_i
    
    df[, i] <- column_i
  }
  return(df)
}

names(vcf_noinvar)[1:10]
 [1] "sample"    "pop"       "super_pop" "sex"       "lat"       "lng"       "X1"        "X2"       
 [9] "X3"        "X4"       
vcf_noNA <- vcf_noinvar
vcf_noNA[, -c(1:6)] <- mean_imputation(vcf_noinvar[, -c(1:6)])

write.csv(vcf_noNA, file = "Cleaned_Data.csv", row.names = F)
LS0tCnRpdGxlOiAiSmFtZXMgTGl1IEZpbmFsIFByb2plY3QgRGF0YSBDbGVhbmluZyBXb3JrZmxvdyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyBMaWJyYXJ5IExvYWRpbmcKYGBge3J9CmxpYnJhcnkodmNmUikKbGlicmFyeSh2ZWdhbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdncHVicikKYGBgCgojIyBDb25maXJtIFdEIGFuZCB2Y2YgbG9jYXRpb24KYGBge3J9CmdldHdkKCkKbGlzdC5maWxlcyhwYXR0ZXJuID0gInZjZiIpCmBgYAoKIyNTZXQgU05QIGRhdGEgZm9yIFIKYGBge3J9Cm15X3ZjZiA8LSAiOC4yMTEyMjI1Ni0yMTM2MjI1Ni5BTEwuY2hyOF9HUkNoMzguZ2Vub3R5cGVzLjIwMTcwNTA0LnZjZi5neiIKdmNmIDwtIHZjZlI6OnJlYWQudmNmUihteV92Y2YsIGNvbnZlcnROQSA9IFRSVUUpCmBgYAoKIyMgQ29udmVydGluZyByYXcgVkNGIHRvIEdlbm90eXBlIFNjb3JlcyBhbmQgc2F2ZSBhcyBjc3YgCmBgYHtyfQp2Y2ZfbnVtIDwtIHZjZlI6OmV4dHJhY3QuZ3QodmNmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICJHVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRHRvUm93TmFtZXMgPSBGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubnVtZXJpYyA9IFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0TkEgPSBUKQoKYGBgCgojIyBUcmFuc3Bvc2luZyBhbmQgRGF0YUZyYW1pbmcgYW5kIHNhdmUgaXQgYXMgY3N2CmBgYHtyfQp2Y2ZfbnVtX3QgPC0gdCh2Y2ZfbnVtKQoKIyMgbWFrZSBpbnRvIGEgZGF0YWZyYW1lCnZjZl9udW1fZGYgPC0gZGF0YS5mcmFtZSh2Y2ZfbnVtX3QpCgojIyBnZXQgcGVyc29uIChzYW1wbGUpIG5hbWVzCnNhbXBsZSA8LSByb3cubmFtZXModmNmX251bV9kZikKCiMjIEFkZCBzYW1wbGUgaW50byBkYXRhZnJhbWUKdmNmX251bV9kZiA8LSBkYXRhLmZyYW1lKHNhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZjZl9udW1fZGYpCgpgYGAKCiMjIENsZWFuIERhdGEKYGBge3J9CnBvcF9tZXRhIDwtIHJlYWQuY3N2KGZpbGUgPSAiMTAwMGdlbm9tZXNfcGVvcGxlX2luZm8yLTEuY3N2IikKCm5hbWVzKHBvcF9tZXRhKQoKbmFtZXModmNmX251bV9kZilbMToxMF0KCnZjZl9udW1fZGYyIDwtIG1lcmdlKHBvcF9tZXRhLAogICAgICAgICAgICAgICAgICAgICB2Y2ZfbnVtX2RmLAogICAgICAgICAgICAgICAgICAgICBieSA9ICJzYW1wbGUiKQoKCgpgYGAKCiMjIE9taXQgSW52YXJpYW50IEZlYXR1cmVzCmBgYHtyfQojIyBmdW5jdGlvbgppbnZhcl9vbWl0IDwtIGZ1bmN0aW9uKHgpewogIGNhdCgiRGF0YWZyYW1lIG9mIGRpbSIsZGltKHgpLCAicHJvY2Vzc2VkLi4uXG4iKQogIHNkcyA8LSBhcHBseSh4LCAyLCBzZCwgbmEucm0gPSBUUlVFKQogIGlfdmFyMCA8LSB3aGljaChzZHMgPT0gMCkKIAogIAogIGNhdChsZW5ndGgoaV92YXIwKSwiY29sdW1ucyByZW1vdmVkXG4iKQogIAogIGlmKGxlbmd0aChpX3ZhcjApID4gMCl7CiAgICAgeCA8LSB4WywgLWlfdmFyMF0KICB9CiAgCiAgIyMgYWRkIHJldHVybigpICB3aXRoIHggaW4gaXQKICByZXR1cm4oeCkgICAgIAp9Cgp2Y2Zfbm9pbnZhciA8LSB2Y2ZfbnVtX2RmMgp2Y2Zfbm9pbnZhclssIC1jKDE6NildIDwtIGludmFyX29taXQodmNmX25vaW52YXJbLCAtYygxOjYpXSkKbXlfbWV0YV9OX2ludmFyX2NvbHMgPC0gMjIwOAoKYGBgCgojIyBSZW1vdmUgTG93LVF1YWxpdHkgCnJlbW92ZSByb3dzIG9yIFNOUHMgd2l0aCBtYW55IE5BcwpgYGB7cn0KZmluZF9OQXMgPC0gZnVuY3Rpb24oeCl7CiAgTkFzX1RGIDwtICBpcy5uYSh4KQogIGlfTkEgPC0gd2hpY2goTkFzX1RGID09IFRSVUUpCiAgTl9OQSA8LSBsZW5ndGgoaV9OQSkKICAKICByZXR1cm4oaV9OQSkKfQoKTl9yb3dzIDwtIG5yb3codmNmX25vaW52YXIpCgpOX05BIDwtIHJlcCh4ID0gMCwgdGltZXMgPSBOX3Jvd3MpCgpOX1NOUHMgPC0gbmNvbCh2Y2Zfbm9pbnZhcikKYGBgCgojI2ZvciBsb29wIHRvIHNlYXJjaCBmb3IgTkFzCgpgYGB7cn0KZm9yIChpIGluIDE6Tl9yb3dzKXsKICBpX05BIDwtIGZpbmRfTkFzKHZjZl9ub2ludmFyW2ksXSkKICBOX05BX2kgPC0gbGVuZ3RoKGlfTkEpCiAgTl9OQVtpXSA8LSBOX05BX2kKICB9CmBgYAoKIyMgQ2hlY2sgaWYgYW55IHJvd3MgaGFzID41MCUgTkFzCmBgYHtyfQpjdXRvZmY1MCA8LSBOX1NOUHMqMC41CnBlcmNlbnRfTkEgPC0gTl9OQS9OX1NOUHMqMTAwCmFueShwZXJjZW50X05BID4gNTApCm15X21ldGFfTl9pbnZhcl9yb3dzIDwtIG1lYW4ocGVyY2VudF9OQSkKCmBgYAojIyBJbXB1dGF0aW9uIG9mIE5BcwpgYGB7cn0KbWVhbl9pbXB1dGF0aW9uIDwtIGZ1bmN0aW9uKGRmKXsKICBuX2NvbHMgPC0gbmNvbChkZikKICAKICBmb3IoaSBpbiAxOm5fY29scyl7CiAgICBjb2x1bW5faSA8LSBkZlssIGldCiAgICAKICAgIG1lYW5faSA8LSBtZWFuKGNvbHVtbl9pLCBuYS5ybSA9IFRSVUUpCiAgICAKICAgIE5Bc19pIDwtIHdoaWNoKGlzLm5hKGNvbHVtbl9pKSkKICAgIAogICAgTl9OQXMgPC0gbGVuZ3RoKE5Bc19pKQogICAgCiAgICBjb2x1bW5faVtOQXNfaV0gPC0gbWVhbl9pCiAgICAKICAgIGRmWywgaV0gPC0gY29sdW1uX2kKICB9CiAgcmV0dXJuKGRmKQp9CgpuYW1lcyh2Y2Zfbm9pbnZhcilbMToxMF0KdmNmX25vTkEgPC0gdmNmX25vaW52YXIKdmNmX25vTkFbLCAtYygxOjYpXSA8LSBtZWFuX2ltcHV0YXRpb24odmNmX25vaW52YXJbLCAtYygxOjYpXSkKCndyaXRlLmNzdih2Y2Zfbm9OQSwgZmlsZSA9ICJDbGVhbmVkX0RhdGEuY3N2Iiwgcm93Lm5hbWVzID0gRikKYGBgCgo=