The example is split into 2 Parts:
Part 1 must be completed first to create a file,
SNPs_cleaned.csv, that has been completely prepared for
analysis.
Now in Part 2, you will analyze the data with PCA. The steps here will be:
scale())prcomp())screeplot())vegan::scores())In the code below all code is provided. Your tasks will be to do 4 things:
Load the vcfR package with library()
library(vcfR) # KEY
## Warning: package 'vcfR' was built under R version 4.2.2
##
## ***** *** 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-2
library(ggplot2)
library(ggpubr)
Set the working directory
setwd("~/Pitt/Year 4/Fall2022/BIOSC1540")
Load the data
SNPs_cleaned <- read.csv(file = "SNPs_cleaned.csv")
warning("If this didn't work, its may be because you didn't set your working directory.")
## Warning: If this didn't work, its may be because you didn't set your working
## directory.
TODO: Use the Scale function to center and scale our data for each SNP to prepare for PCA.
SNPs_scaled <- scale(SNPs_cleaned)
TODO: Use the prcomp function to run PCA on our scaled data
pca_scaled <- prcomp(SNPs_scaled)
TODO: Determine how many PCs are essential to interpret the data by visualizing their importance using a screeplot
TODO: UPDATE PLOT WITH TITLE
screeplot(pca_scaled,
ylab = "Relative importance",
main = "Principle Components")
TODO: INTERPRET SCREEPLOT
PC1 captures a wide amount of variation. PC1 and PC2 are the most important to consider, however, PC1 is the most important by far.
TODO: Determine how much percent of variation is captured by each PC by converting our PCA analysis to represent captured percent of variation.
summary_out_scaled <- summary(pca_scaled)
PCA_variation <- function(pca_summary, PCs = 2){
var_explained <- pca_summary$importance[2,1:PCs]*100
var_explained <- round(var_explained,1)
return(var_explained)
}
var_out <- PCA_variation(summary_out_scaled,PCs = 10)
N_columns <- ncol(SNPs_scaled)
barplot(var_out,
main = "Percent variation Scree plot",
ylab = "Percent variation explained")
abline(h = 1/N_columns*100, col = 2, lwd = 2)
TODO: INTERPRET VARIANCE EXPLAINED
PC1 accounts for the largest percent of variation within the data set. If we wanted to account for ~99% of the variation, we would need to consider every PC that is above the red line.
TODO: Create a biplot using our PCA analysis to determine if any single feature is highly correlated to the PCs.
biplot(pca_scaled)
TODO: EXPLAIN WHY THIS IS A BAD IDEA It is ugly, there are too many SNPS and thus too many vectors. This results in this being to ugly to interpret anything.
TODO: Generate PCA scores to plot and determine if we can see any clusters forming for each individual point.
pca_scores <- vegan::scores(pca_scaled)
TODO: Add categorical labels back to data
pop_id <- c("Nel","Nel","Nel","Nel","Nel","Nel","Nel","Nel",
"Nel", "Nel", "Nel", "Nel", "Nel", "Nel", "Nel", "Alt",
"Alt", "Alt", "Alt", "Alt", "Alt", "Alt", "Alt", "Alt",
"Alt", "Alt", "Alt", "Alt", "Alt", "Alt", "Sub", "Sub",
"Sub", "Sub", "Sub", "Sub", "Sub", "Sub", "Sub", "Sub",
"Sub", "Cau", "Cau", "Cau", "Cau", "Cau", "Cau", "Cau",
"Cau", "Cau", "Cau", "Cau", "Cau", "Div", "Div", "Div",
"Div", "Div", "Div", "Div", "Div", "Div", "Div", "Div",
"Div", "Div", "Div", "Div")
TODO: Label PCA scores with population ID so we can then plot data on a scatter plot.
pca_scores2 <- data.frame(pop_id,
pca_scores)
TODO: Visualize PCA results by plotting PCA scores and determine if we see any clusters forming that can be used to group based on population categories.
TODO: UPDATE PLOT WITH TITLE TODO: UPDATE X and Y AXES WITH AMOUNT OF VARIATION EXPLAINED
ggpubr::ggscatter(data = pca_scores2,
y = "PC2",
x = "PC1",
color = "pop_id",
shape = "pop_id",
xlab = "PC1 (19.9% variation)",
ylab = "PC2 (2.3% variation)",
main = "PCA of SNP Data")
TODO: INTERPRET PLOT
We have three distinct groups of Cau/Div, Alt/Nel, and Sub. We could run a clustering algorithm to determine if this is true clusters we see forming and how significant this would be.