From 528ea7cbc9ca554fbb92292b1ff9e305efb18f6d Mon Sep 17 00:00:00 2001 From: Obed Mortey Date: Fri, 20 Mar 2026 01:09:17 -0230 Subject: [PATCH 1/3] Modified assignment_1.qmd and Created new html file --- 02_activities/assignments/assignment_1.html | 976 ++++++++++++++++++++ 02_activities/assignments/assignment_1.qmd | 198 +++- 2 files changed, 1149 insertions(+), 25 deletions(-) create mode 100644 02_activities/assignments/assignment_1.html diff --git a/02_activities/assignments/assignment_1.html b/02_activities/assignments/assignment_1.html new file mode 100644 index 0000000..2c61bcf --- /dev/null +++ b/02_activities/assignments/assignment_1.html @@ -0,0 +1,976 @@ + + + + + + + + + +Assignment #1 + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+

Assignment #1

+
+ + + +
+ + + + +
+ + + +
+ + +
+

Assignment 1

+

You only need to write lines of code for each question. When answering questions that ask you to identify or interpret something, the length of your response doesn’t matter. For example, if the answer is just ‘yes,’ ‘no,’ or a number, you can just give that answer without adding anything else.

+

We will go through comparable code and concepts in the live learning session. If you run into trouble, start by using the help help() function in R, to get information about the datasets and function in question. The internet is also a great resource when coding (though note that no outside searches are required by the assignment!). If you do incorporate code from the internet, please cite the source within your code (providing a URL is sufficient).

+

Please bring questions that you cannot work out on your own to office hours, work periods or share with your peers on Slack. We will work with you through the issue.

+

You will need to install PLINK and run the analyses. Please follow the OS-specific setup guide in SETUP.md. PLINK is a free, open-source whole genome association analysis toolset, designed to perform a range of basic, large-scale analyses in a computationally efficient manner.

+
+

Question 1: Data inspection

+

Before fitting any models, it is essential to understand the data. Use R or bash code to answer the following questions about the gwa.qc.A1.fam, gwa.qc.A1.bim, and gwa.qc.A1.bed files, available at the following Google Drive link: https://drive.google.com/drive/folders/11meVqGCY5yAyI1fh-fAlMEXQt0VmRGuz?usp=drive_link. Please download all three files from this link and place them in 02_activities/data/.

+
+
library(data.table)
+library(ggplot2)
+library(seqminer)
+library(HardyWeinberg)
+library(dplyr)
+
+
    +
  1. Read the .fam file. How many samples does the dataset contain?
  2. +
+
+
cd ~/Downloads/gen_data/02_activities/data
+pwd
+head gwa.qc.A1.fam
+
+
/c/Users/obedk/Downloads/gen_data/02_activities/data
+0   A2001   0   0   1   -0.694438129641973
+1   A2002   0   0   1   1.85384536141856
+2   A2003   0   0   1   2.08263677761584
+3   A2004   0   0   1   2.73871473943968
+4   A2005   0   0   1   1.34114035564636
+5   A2006   0   0   1   0.416778586749647
+6   A2007   0   0   1   2.38297123290054
+7   A2008   0   0   1   1.51429928826958
+8   A2009   0   0   1   0.718686390529039
+9   A2010   0   0   1   2.08904136245205
+
+
+
+
# Read the .fam file
+fam_file <- read.table("~/Downloads/gen_data/02_activities/data/gwa.qc.A1.fam", header = FALSE)
+
+# Count the number of samples and display the result
+num_samples <- nrow(fam_file)
+print(paste("Number of samples in the dataset:", num_samples))
+
+
[1] "Number of samples in the dataset: 4000"
+
+
+
    +
  1. What is the ‘variable type’ of the response variable (i.e.Continuous or binary)?
  2. +
+
Continuous variable.
+
    +
  1. Read the .bim file. How many SNPs does the dataset contain?
  2. +
+
+
# Read the .bim file
+bim_file <- read.table("~/Downloads/gen_data/02_activities/data/gwa.qc.A1.bim", header = FALSE)
+
+# Count the number of SNPs and display the result
+num_snps <- nrow(bim_file)
+print(paste("Number of SNPs in the dataset:", num_snps))
+
+
[1] "Number of SNPs in the dataset: 101083"
+
+
+
+
+

Question 2: Allele Frequency Estimation

+
    +
  1. Load the genotype matrix for SNPs rs1861, rs3813199, rs3128342, and rs11804831 using additive coding. What are the allele frequencies (AFs) for these four SNPs?
  2. +
+
+
# Step 1: Create SNP list file with 4 specified SNPs
+printf "%s\n" rs1861 rs3813199 rs3128342 rs11804831 > ~/Downloads/gen_data/02_activities/data/snplist.txt
+
+
+
# Step 2: Extract genotypes for the specified SNPs and recode to additive format
+/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A1 \
+      --extract ~/Downloads/gen_data/02_activities/data/snplist.txt \
+      --recode A \
+      --out ~/Downloads/gen_data/02_activities/data/geno.additive
+
+
+
# Step 3: Load genotype data matrix
+geno_subset <- fread("~/Downloads/gen_data/02_activities/data/geno.additive.raw")
+geno_subset=na.omit(geno_subset)
+geno_subset$PHENOTYPE=geno_subset$PHENOTYPE-1
+head(geno_subset)
+
+
     FID    IID   PAT   MAT   SEX PHENOTYPE rs3813199_G rs11804831_T
+   <int> <char> <int> <int> <int>     <num>       <int>        <int>
+1:     1  A2002     0     0     1   0.85385           2            2
+2:     2  A2003     0     0     1   1.08264           2            1
+3:     3  A2004     0     0     1   1.73871           2            2
+4:     4  A2005     0     0     1   0.34114           2            1
+5:     6  A2007     0     0     1   1.38297           2            2
+6:     7  A2008     0     0     1   0.51430           2            2
+   rs3128342_C rs1861_C
+         <int>    <int>
+1:           2        2
+2:           2        2
+3:           1        2
+4:           1        2
+5:           2        2
+6:           1        2
+
+
+
+
# Step 4: Calculate allele frequencies for the specified SNPs
+/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A1 \
+      --extract ~/Downloads/gen_data/02_activities/data/snplist.txt \
+      --freq \
+      --out ~/Downloads/gen_data/02_activities/data/gwa_qc_A1_freqs
+
+# The allele frequencies will be saved in the file gwa_qc_A1_freqs.afreq with column ALT_FREQS representing the allele frequencies for the specified SNPs.
+
+
+
# Step 5: View allele frequencies of the specified SNPs
+freq <- fread("~/Downloads/gen_data/02_activities/data/gwa_qc_A1_freqs.afreq")
+head(freq)
+
+
   #CHROM         ID    REF    ALT PROVISIONAL_REF? ALT_FREQS OBS_CT
+    <int>     <char> <char> <char>           <char>     <num>  <int>
+1:      1  rs3813199      G      A                Y 0.0569126   7942
+2:      1 rs11804831      T      C                Y 0.1543410   7924
+3:      1  rs3128342      C      A                Y 0.3051210   7928
+4:      1     rs1861      C      A                Y 0.0539859   7928
+
+
+
    +
  1. What are the minor allele frequencies (MAFs) for these four SNPs?
  2. +
+
+
# Calculate minor allele frequencies (MAFs) for the specified SNPs   
+awk 'NR==1 {print "SNP_ID\tMAF"} NR>1 {maf = ($6 > 0.5) ? 1 - $6 : $6; print $2 "\t" maf}' ~/Downloads/gen_data/02_activities/data/gwa_qc_A1_freqs.afreq
+
+# The MAFs will be calculated based on the ALT_FREQS column in the gwa_qc_A1_freqs.afreq file. The output will show the SNP ID and its corresponding MAF. Since the MAF is the frequency of the less common allele, it is calculated as 1 - ALT_FREQS if ALT_FREQS is greater than 0.5, otherwise it is just ALT_FREQS.
+
+
SNP_ID  MAF
+rs3813199   0.0569126
+rs11804831  0.154341
+rs3128342   0.305121
+rs1861  0.0539859
+
+
+
+
+

Question 3: Hardy–Weinberg Equilibrium (HWE) Test

+
    +
  1. Conduct the Hardy–Weinberg Equilibrium (HWE) test for all SNPs in the .bim file. Then, load the file containing the HWE p-value results and display the first few rows of the resulting data frame.
  2. +
+
+
# Step 1: Conduct HWE test for all SNPs in the .bim file
+/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A1 --hardy --out ~/Downloads/gen_data/02_activities/data/gwa_qc_A1_hwe
+
+

This produces gwa_qc_A1_hwe.hardy containing observed and expected genotype counts plus p-values.

+
+
# Step 2: View HWE results
+hwe <- fread("~/Downloads/gen_data/02_activities/data/gwa_qc_A1_hwe.hardy")
+head(hwe)
+
+
   #CHROM         ID     A1     AX HOM_A1_CT HET_A1_CT TWO_AX_CT O(HET_A1)
+    <int>     <char> <char> <char>     <int>     <int>     <int>     <num>
+1:      1  rs3737728      G      A      1713      1841       428  0.462330
+2:      1  rs1320565      C      T      3368       589        19  0.148139
+3:      1  rs3813199      G      A      3531       428        12  0.107781
+4:      1 rs11804831      T      C      2820      1061        81  0.267794
+5:      1  rs3766178      T      C      2391      1378       214  0.345970
+6:      1  rs3128342      C      A      1927      1655       382  0.417508
+   E(HET_A1)         P
+       <num>     <num>
+1:  0.447932 0.0437892
+2:  0.145262 0.2734290
+3:  0.107347 1.0000000
+4:  0.261040 0.1133540
+5:  0.350629 0.4158770
+6:  0.424044 0.3302730
+
+
+
    +
  1. What are the HWE p-values for SNPs rs1861, rs3813199, rs3128342, and rs11804831?
  2. +
+
+
# Extract HWE p-values for the specified SNPs       
+grep -wFf ~/Downloads/gen_data/02_activities/data/snplist.txt ~/Downloads/gen_data/02_activities/data/gwa_qc_A1_hwe.hardy | awk '{print $2 "\t" $10}'
+
+
rs3813199   1
+rs11804831  0.113354
+rs3128342   0.330273
+rs1861  0.274719
+
+
+
+
+

Question 4: Genetic Association Test

+
    +
  1. Conduct a linear regression to test the association between SNP rs1861 and the phenotype. What is the p-value?
  2. +
+
+
#Pick SNP rs1861
+table(geno_subset$rs1861_C)
+
+

+   0    1    2 
+  14  389 3459 
+
+
freq[freq$ID=='rs1861',]
+
+
   #CHROM     ID    REF    ALT PROVISIONAL_REF? ALT_FREQS OBS_CT
+    <int> <char> <char> <char>           <char>     <num>  <int>
+1:      1 rs1861      C      A                Y 0.0539859   7928
+
+
head(geno_subset)
+
+
     FID    IID   PAT   MAT   SEX PHENOTYPE rs3813199_G rs11804831_T
+   <int> <char> <int> <int> <int>     <num>       <int>        <int>
+1:     1  A2002     0     0     1   0.85385           2            2
+2:     2  A2003     0     0     1   1.08264           2            1
+3:     3  A2004     0     0     1   1.73871           2            2
+4:     4  A2005     0     0     1   0.34114           2            1
+5:     6  A2007     0     0     1   1.38297           2            2
+6:     7  A2008     0     0     1   0.51430           2            2
+   rs3128342_C rs1861_C
+         <int>    <int>
+1:           2        2
+2:           2        2
+3:           1        2
+4:           1        2
+5:           2        2
+6:           1        2
+
+
+

The C allele is the major allele, with frequency 1 - 0.0539859.

+
+
# Fit linear regression model
+model <- glm(PHENOTYPE ~ rs1861_C, data = geno_subset, family = gaussian)
+
+# View model summary
+summary(model)
+
+

+Call:
+glm(formula = PHENOTYPE ~ rs1861_C, family = gaussian, data = geno_subset)
+
+Coefficients:
+            Estimate Std. Error t value Pr(>|t|)    
+(Intercept) -0.93891    0.09626  -9.753   <2e-16 ***
+rs1861_C     0.96698    0.05016  19.279   <2e-16 ***
+---
+Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+
+(Dispersion parameter for gaussian family taken to be 1.00628)
+
+    Null deviance: 4258.2  on 3861  degrees of freedom
+Residual deviance: 3884.2  on 3860  degrees of freedom
+AIC: 10988
+
+Number of Fisher Scoring iterations: 2
+
+
table(geno_subset$rs1861_C)
+
+

+   0    1    2 
+  14  389 3459 
+
+
# The p value for the association between SNP rs1861 and the phenotype is p < 2e-16, which is highly significant. This suggests that there is a strong association between the genotype of SNP rs1861 and the phenotype being studied. 
+
+
    +
  1. How would you interpret the beta coefficient from this regression?
  2. +
+
The beta coefficient for rs1861_C represents the change in the phenotype associated with each additional copy of the C allele. If the beta coefficient is positive, it indicates that the presence of the C allele is associated with an increase in the phenotype. Conversely, if the beta coefficient is negative, it suggests that the C allele is associated with a decrease in the phenotype. The magnitude of the beta coefficient indicates the strength of this association, while its sign (positive or negative) indicates the direction of the effect.
+
+In this case, since the beta coefficient is positive (i.e., +0.96698), it suggests that individuals with more copies of the C allele tend to have higher values of the phenotype. The exact interpretation would depend on the context of the phenotype being studied and the units of measurement for both the genotype and the phenotype.
+
    +
  1. Plot the scatterplot of phenotype versus the genotype of SNP rs1861. Add the regression line to the plot.
  2. +
+
+
# 1. Clean the data (remove missing genotypes or phenotypes)
+clean_data <- geno_subset %>%
+  filter(!is.na(rs1861_C), !is.na(PHENOTYPE))
+
+# 2. Build the scatterplot
+p1 <- ggplot(clean_data, aes(x = rs1861_C, y = PHENOTYPE)) +
+  # Add points with horizontal jitter and transparency to prevent overlapping
+  geom_jitter(width = 0.1, height = 0, color = "blue", alpha = 0.3, size = 2) +
+  # Automatically calculate and draw the linear regression line (with confidence interval)
+  geom_smooth(method = "lm", color = "red", se = TRUE, linewidth = 1.2) +
+  labs(
+    title = "Linear Regression: Continuous Phenotype ~ Genotype (rs1861)",
+    x = "Genotype (Number of Alternative Alleles: 0, 1, 2)",
+    y = "Phenotype Measurement"
+  ) +
+  # Lock the x-axis to our discrete genotype categories
+  scale_x_continuous(breaks = c(0, 1, 2)) +
+  coord_cartesian(xlim = c(-0.5, 2.5)) +
+  # Apply a clean, minimal theme
+  theme_minimal()
+
+# 3. Display the plot
+print(p1)
+
+
+
+

+
+
+
+
+
    +
  1. Convert the genotype coding for rs1861 to recessive coding.
  2. +
+
+
# Make a copy for recessive data
+geno_subset_rec <- geno_subset  
+
+# Apply the recessive logic (only 2 becomes 1, everything else is 0)
+geno_subset_rec[, 7:ncol(geno_subset_rec)] <- as.data.frame(
+  lapply(geno_subset[, 7:ncol(geno_subset)], function(x) ifelse(x == 2, 1, 0))
+)
+
+
    +
  1. Conduct a linear regression to test the association between the recessive-coded rs1861 and the phenotype. What is the p-value?
  2. +
+
+
# Fit linear regression model
+model <- glm(PHENOTYPE ~ rs1861_C, data = geno_subset_rec, family = gaussian)
+summary(model)
+
+

+Call:
+glm(formula = PHENOTYPE ~ rs1861_C, family = gaussian, data = geno_subset_rec)
+
+Coefficients:
+             Estimate Std. Error t value Pr(>|t|)    
+(Intercept) -0.006248   0.050047  -0.125    0.901    
+rs1861_C     1.001393   0.052882  18.936   <2e-16 ***
+---
+Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+
+(Dispersion parameter for gaussian family taken to be 1.0094)
+
+    Null deviance: 4258.2  on 3861  degrees of freedom
+Residual deviance: 3896.3  on 3860  degrees of freedom
+AIC: 11000
+
+Number of Fisher Scoring iterations: 2
+
+
+

The p-value for the association between the recessive-coded rs1861 and the phenotype is p < 2e-16, which is highly significant. This suggests that there is a strong association between the recessive genotype of SNP rs1861 and the phenotype being studied. The interpretation of this result would depend on the context of the phenotype and the specific coding used for the recessive model, but it indicates that individuals with two copies of the alternative allele (coded as 1) have a significantly different phenotype compared to those with zero or one copy (coded as 0).

+
    +
  1. Plot the scatterplot of phenotype versus the recessive-coded genotype of rs1861. Add the regression line to the plot.
  2. +
+
+
# 1. Clean the data using your new recessive dataframe
+clean_data_rec <- geno_subset_rec %>%
+  filter(!is.na(rs1861_C), !is.na(PHENOTYPE))
+
+# 2. Build the continuous scatterplot
+p4 <- ggplot(clean_data_rec, aes(x = rs1861_C, y = PHENOTYPE)) +
+  # Add points with slight horizontal jitter
+  geom_jitter(width = 0.05, height = 0, color = "blue", alpha = 0.3, size = 2) +
+  # Automatically draw the linear regression line
+  geom_smooth(method = "lm", color = "red", se = TRUE, linewidth = 1.2) +
+  labs(
+    title = "Linear Regression: Continuous Phenotype ~ Recessive Genotype",
+    # Updated x-axis label to reflect recessive biology
+    x = "Genotype (0 = Carrier/No Alt, 1 = Exactly 2 Copies of Alt)",
+    y = "Continuous Phenotype"
+  ) +
+  # Lock the x-axis to exactly 0 and 1
+  scale_x_continuous(breaks = c(0, 1)) +
+  coord_cartesian(xlim = c(-0.5, 1.5)) +
+  theme_minimal()
+
+# 3. Display the plot
+print(p4)
+
+
+
+

+
+
+
+
+
    +
  1. Which model fits better? Justify your answer.
  2. +
+
To determine which model fits better, we can compare the two linear regression models (additive vs. recessive) using metrics such as the Akaike Information Criterion (AIC) or the R-squared value. The model with the lower AIC or higher R-squared would be considered a better fit to the data. Additionally, we can look at the significance of the coefficients and the overall p-values for each model to assess which one provides a more meaningful association between the genotype and the phenotype. In this case, since both models have highly significant p-values, we would need to compare their AIC values or R-squared values to make a final determination on which model fits better. The additive model with an AIC of 10988 compared with 11000 for the recessive model suggests that the additive model fits the data better, as it has a lower AIC value. This indicates that the additive model provides a better balance of goodness-of-fit and model complexity compared to the recessive model.
+
+
+

Criteria

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CriteriaCompleteIncomplete
Data InspectionCorrect sample/SNP counts and variable type identified.Missing or incorrect counts or variable type.
Allele Frequency EstimationCorrect allele and minor allele frequencies computed.Frequencies missing or wrong.
Hardy–Weinberg Equilibrium TestCorrect PLINK command and p-value extraction in R.PLINK command or extraction incorrect/missing.
Genetic Association TestCorrect regressions, plots, coding, and interpretation.Regression, plots, or interpretation missing/incomplete.
+
+
+

Submission Information

+

📌 Please review our Assignment Submission Guide for detailed instructions on how to format, branch, and submit your work. Following these guidelines is crucial for your submissions to be evaluated correctly.

+
+

Note:

+

If you like, you may collaborate with others in the cohort. If you choose to do so, please indicate with whom you have worked with in your pull request by tagging their GitHub username. Separate submissions are required.

+
+
+
+

Submission Parameters

+
    +
  • Submission Due Date: 11:59 PM – 16/03/2026

  • +
  • Branch name for your repo should be: assignment-1

  • +
  • What to submit for this assignment:

    +
      +
    • Populate this Quarto document (assignment_1.qmd).
    • +
    • Render the document with Quarto: quarto render assignment_1.qmd.
    • +
    • Submit both assignment_1.qmd and the rendered HTML file assignment_1.html in your pull request.
    • +
  • +
  • What the pull request link should look like for this assignment: https://github.com/<your_github_username>/gen_data/pull/<pr_id>

    +
      +
    • Open a private window in your browser. Copy and paste the link to your pull request into the address bar. Make sure you can see your pull request properly. This helps the technical facilitator and learning support team review your submission easily.
    • +
  • +
+
+

Checklist:

+
    +
  • Created a branch with the correct naming convention.
  • +
  • Ensured that the repository is public.
  • +
  • Reviewed the PR description guidelines and adhered to them.
  • +
  • Verified that the link is accessible in a private browser window.
  • +
  • Confirmed that both assignment_1.qmd and assignment_1.html are included in the pull request.
  • +
+

If you encounter any difficulties or have questions, please don’t hesitate to reach out to our team via our Slack help channel. Our technical facilitators and learning support team are here to help you navigate any challenges.

+
+
+
+ +
+ + +
+ + + + + \ No newline at end of file diff --git a/02_activities/assignments/assignment_1.qmd b/02_activities/assignments/assignment_1.qmd index 550af3d..a19fe9a 100644 --- a/02_activities/assignments/assignment_1.qmd +++ b/02_activities/assignments/assignment_1.qmd @@ -17,94 +17,242 @@ You will need to install PLINK and run the analyses. Please follow the OS-specif Before fitting any models, it is essential to understand the data. Use R or bash code to answer the following questions about the `gwa.qc.A1.fam`, `gwa.qc.A1.bim`, and `gwa.qc.A1.bed` files, available at the following Google Drive link: . Please download all three files from this link and place them in `02_activities/data/`. +```{r setup, include=FALSE} +# Set up a consistent path for all chunks of code +knitr::opts_knit$set(root.dir = normalizePath("../../")) + +# Force Quarto to use Git Bash for all {bash} chunks +knitr::opts_chunk$set(engine.path = list(bash = "C:/Program Files/Git/bin/bash.exe")) +``` + +```{r, message=FALSE, warning=FALSE, results='hide'} +library(data.table) +library(ggplot2) +library(seqminer) +library(HardyWeinberg) +library(dplyr) +``` (i) Read the .fam file. How many samples does the dataset contain? -``` -# Your answer here... +```{bash} +cd ~/Downloads/gen_data/02_activities/data +pwd +head gwa.qc.A1.fam +``` +```{r} +# Read the .fam file +fam_file <- read.table("~/Downloads/gen_data/02_activities/data/gwa.qc.A1.fam", header = FALSE) + +# Count the number of samples and display the result +num_samples <- nrow(fam_file) +print(paste("Number of samples in the dataset:", num_samples)) ``` (ii) What is the 'variable type' of the response variable (i.e.Continuous or binary)? ``` -# Your answer here... +Continuous variable. ``` (iii) Read the .bim file. How many SNPs does the dataset contain? -``` -# Your answer here... +```{r} +# Read the .bim file +bim_file <- read.table("~/Downloads/gen_data/02_activities/data/gwa.qc.A1.bim", header = FALSE) + +# Count the number of SNPs and display the result +num_snps <- nrow(bim_file) +print(paste("Number of SNPs in the dataset:", num_snps)) ``` #### Question 2: Allele Frequency Estimation (i) Load the genotype matrix for SNPs rs1861, rs3813199, rs3128342, and rs11804831 using additive coding. What are the allele frequencies (AFs) for these four SNPs? -``` -# Your code here... +```{bash,message=FALSE, warning=FALSE} +# Step 1: Create SNP list file with 4 specified SNPs +printf "%s\n" rs1861 rs3813199 rs3128342 rs11804831 > ~/Downloads/gen_data/02_activities/data/snplist.txt +``` + +```{bash, results='hide',message=FALSE, warning=FALSE} +# Step 2: Extract genotypes for the specified SNPs and recode to additive format +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A1 \ + --extract ~/Downloads/gen_data/02_activities/data/snplist.txt \ + --recode A \ + --out ~/Downloads/gen_data/02_activities/data/geno.additive +``` + +```{r} +# Step 3: Load genotype data matrix +geno_subset <- fread("~/Downloads/gen_data/02_activities/data/geno.additive.raw") +geno_subset=na.omit(geno_subset) +geno_subset$PHENOTYPE=geno_subset$PHENOTYPE-1 +head(geno_subset) +``` + +```{bash, results='hide',message=FALSE, warning=FALSE} +# Step 4: Calculate allele frequencies for the specified SNPs +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A1 \ + --extract ~/Downloads/gen_data/02_activities/data/snplist.txt \ + --freq \ + --out ~/Downloads/gen_data/02_activities/data/gwa_qc_A1_freqs + +# The allele frequencies will be saved in the file gwa_qc_A1_freqs.afreq with column ALT_FREQS representing the allele frequencies for the specified SNPs. +``` + +```{r,message=FALSE, warning=FALSE} +# Step 5: View allele frequencies of the specified SNPs +freq <- fread("~/Downloads/gen_data/02_activities/data/gwa_qc_A1_freqs.afreq") +head(freq) ``` (ii) What are the minor allele frequencies (MAFs) for these four SNPs? -``` -# Your code here... +```{bash, results='show',message=FALSE, warning=FALSE} +# Calculate minor allele frequencies (MAFs) for the specified SNPs +awk 'NR==1 {print "SNP_ID\tMAF"} NR>1 {maf = ($6 > 0.5) ? 1 - $6 : $6; print $2 "\t" maf}' ~/Downloads/gen_data/02_activities/data/gwa_qc_A1_freqs.afreq + +# The MAFs will be calculated based on the ALT_FREQS column in the gwa_qc_A1_freqs.afreq file. The output will show the SNP ID and its corresponding MAF. Since the MAF is the frequency of the less common allele, it is calculated as 1 - ALT_FREQS if ALT_FREQS is greater than 0.5, otherwise it is just ALT_FREQS. ``` #### Question 3: Hardy–Weinberg Equilibrium (HWE) Test (i) Conduct the Hardy–Weinberg Equilibrium (HWE) test for all SNPs in the .bim file. Then, load the file containing the HWE p-value results and display the first few rows of the resulting data frame. -``` -# Your code here... +```{bash,results='hide',message=FALSE, warning=FALSE} +# Step 1: Conduct HWE test for all SNPs in the .bim file +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A1 --hardy --out ~/Downloads/gen_data/02_activities/data/gwa_qc_A1_hwe +``` + +This produces gwa_qc_A1_hwe.hardy containing observed and expected genotype counts plus p-values. + +```{r,message=FALSE, warning=FALSE} +# Step 2: View HWE results +hwe <- fread("~/Downloads/gen_data/02_activities/data/gwa_qc_A1_hwe.hardy") +head(hwe) ``` (ii) What are the HWE p-values for SNPs rs1861, rs3813199, rs3128342, and rs11804831? -``` -# Your code here... +```{bash, results='show',message=FALSE, warning=FALSE} +# Extract HWE p-values for the specified SNPs +grep -wFf ~/Downloads/gen_data/02_activities/data/snplist.txt ~/Downloads/gen_data/02_activities/data/gwa_qc_A1_hwe.hardy | awk '{print $2 "\t" $10}' ``` #### Question 4: Genetic Association Test (i) Conduct a linear regression to test the association between SNP rs1861 and the phenotype. What is the p-value? -``` -# Your code here... +```{r,message=FALSE, warning=FALSE} +#Pick SNP rs1861 +table(geno_subset$rs1861_C) +freq[freq$ID=='rs1861',] +head(geno_subset) +``` + +The C allele is the major allele, with frequency 1 - 0.0539859. + +```{r,message=FALSE, warning=FALSE} +# Fit linear regression model +model <- glm(PHENOTYPE ~ rs1861_C, data = geno_subset, family = gaussian) + +# View model summary +summary(model) +table(geno_subset$rs1861_C) + +# The p value for the association between SNP rs1861 and the phenotype is p < 2e-16, which is highly significant. This suggests that there is a strong association between the genotype of SNP rs1861 and the phenotype being studied. ``` (ii) How would you interpret the beta coefficient from this regression? ``` -# Your answer here... +The beta coefficient for rs1861_C represents the change in the phenotype associated with each additional copy of the C allele. If the beta coefficient is positive, it indicates that the presence of the C allele is associated with an increase in the phenotype. Conversely, if the beta coefficient is negative, it suggests that the C allele is associated with a decrease in the phenotype. The magnitude of the beta coefficient indicates the strength of this association, while its sign (positive or negative) indicates the direction of the effect. + +In this case, since the beta coefficient is positive (i.e., +0.96698), it suggests that individuals with more copies of the C allele tend to have higher values of the phenotype. The exact interpretation would depend on the context of the phenotype being studied and the units of measurement for both the genotype and the phenotype. ``` (iii) Plot the scatterplot of phenotype versus the genotype of SNP rs1861. Add the regression line to the plot. -``` -# Your code here... +```{r,message=FALSE, warning=FALSE} + +# 1. Clean the data (remove missing genotypes or phenotypes) +clean_data <- geno_subset %>% + filter(!is.na(rs1861_C), !is.na(PHENOTYPE)) + +# 2. Build the scatterplot +p1 <- ggplot(clean_data, aes(x = rs1861_C, y = PHENOTYPE)) + + # Add points with horizontal jitter and transparency to prevent overlapping + geom_jitter(width = 0.1, height = 0, color = "blue", alpha = 0.3, size = 2) + + # Automatically calculate and draw the linear regression line (with confidence interval) + geom_smooth(method = "lm", color = "red", se = TRUE, linewidth = 1.2) + + labs( + title = "Linear Regression: Continuous Phenotype ~ Genotype (rs1861)", + x = "Genotype (Number of Alternative Alleles: 0, 1, 2)", + y = "Phenotype Measurement" + ) + + # Lock the x-axis to our discrete genotype categories + scale_x_continuous(breaks = c(0, 1, 2)) + + coord_cartesian(xlim = c(-0.5, 2.5)) + + # Apply a clean, minimal theme + theme_minimal() + +# 3. Display the plot +print(p1) ``` (iv) Convert the genotype coding for rs1861 to recessive coding. -``` -# Your code here... +```{r,message=FALSE, warning=FALSE} +# Make a copy for recessive data +geno_subset_rec <- geno_subset + +# Apply the recessive logic (only 2 becomes 1, everything else is 0) +geno_subset_rec[, 7:ncol(geno_subset_rec)] <- as.data.frame( + lapply(geno_subset[, 7:ncol(geno_subset)], function(x) ifelse(x == 2, 1, 0)) +) ``` (v) Conduct a linear regression to test the association between the recessive-coded rs1861 and the phenotype. What is the p-value? -``` -# Your code here... +```{r,message=FALSE, warning=FALSE} +# Fit linear regression model +model <- glm(PHENOTYPE ~ rs1861_C, data = geno_subset_rec, family = gaussian) +summary(model) ``` +The p-value for the association between the recessive-coded rs1861 and the phenotype is p < 2e-16, which is highly significant. This suggests that there is a strong association between the recessive genotype of SNP rs1861 and the phenotype being studied. The interpretation of this result would depend on the context of the phenotype and the specific coding used for the recessive model, but it indicates that individuals with two copies of the alternative allele (coded as 1) have a significantly different phenotype compared to those with zero or one copy (coded as 0). (vi) Plot the scatterplot of phenotype versus the recessive-coded genotype of rs1861. Add the regression line to the plot. -``` -# Your code here... +```{r,message=FALSE, warning=FALSE} +# 1. Clean the data using your new recessive dataframe +clean_data_rec <- geno_subset_rec %>% + filter(!is.na(rs1861_C), !is.na(PHENOTYPE)) + +# 2. Build the continuous scatterplot +p4 <- ggplot(clean_data_rec, aes(x = rs1861_C, y = PHENOTYPE)) + + # Add points with slight horizontal jitter + geom_jitter(width = 0.05, height = 0, color = "blue", alpha = 0.3, size = 2) + + # Automatically draw the linear regression line + geom_smooth(method = "lm", color = "red", se = TRUE, linewidth = 1.2) + + labs( + title = "Linear Regression: Continuous Phenotype ~ Recessive Genotype", + # Updated x-axis label to reflect recessive biology + x = "Genotype (0 = Carrier/No Alt, 1 = Exactly 2 Copies of Alt)", + y = "Continuous Phenotype" + ) + + # Lock the x-axis to exactly 0 and 1 + scale_x_continuous(breaks = c(0, 1)) + + coord_cartesian(xlim = c(-0.5, 1.5)) + + theme_minimal() + +# 3. Display the plot +print(p4) ``` (vii) Which model fits better? Justify your answer. ``` -# Your answer here... +To determine which model fits better, we can compare the two linear regression models (additive vs. recessive) using metrics such as the Akaike Information Criterion (AIC) or the R-squared value. The model with the lower AIC or higher R-squared would be considered a better fit to the data. Additionally, we can look at the significance of the coefficients and the overall p-values for each model to assess which one provides a more meaningful association between the genotype and the phenotype. In this case, since both models have highly significant p-values, we would need to compare their AIC values or R-squared values to make a final determination on which model fits better. The additive model with an AIC of 10988 compared with 11000 for the recessive model suggests that the additive model fits the data better, as it has a lower AIC value. This indicates that the additive model provides a better balance of goodness-of-fit and model complexity compared to the recessive model. ``` ### Criteria From 28cd63c9720397919a1958a93271d61145710b74 Mon Sep 17 00:00:00 2001 From: Obed Mortey Date: Thu, 2 Apr 2026 15:11:33 -0230 Subject: [PATCH 2/3] Populated qmd file and created html file --- 02_activities/assignments/assignment_2.html | 1078 +++++++++++++++++++ 02_activities/assignments/assignment_2.qmd | 108 +- 2 files changed, 1175 insertions(+), 11 deletions(-) create mode 100644 02_activities/assignments/assignment_2.html diff --git a/02_activities/assignments/assignment_2.html b/02_activities/assignments/assignment_2.html new file mode 100644 index 0000000..91f7505 --- /dev/null +++ b/02_activities/assignments/assignment_2.html @@ -0,0 +1,1078 @@ + + + + + + + + + +Assignment #2 + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+

Assignment #2

+
+ + + +
+ + + + +
+ + + +
+ + +

You will need PLINK2 installed and available in your PATH. Please follow the OS-specific setup guide in SETUP.md. The dataset for this assignment consists of the following binary PLINK files: gwa.A2.bed, gwa.A2.bim, gwa.A2.fam , available at the following Google Drive link: https://drive.google.com/drive/folders/1rHoy3z52Yyj985ukjjtLhfIBxchpyYtZ?usp=drive_link. Please download all three files and save them in 02_activities/data/.

+
+
library(data.table)
+library(ggplot2)
+library(seqminer)
+library(HardyWeinberg)
+library(dplyr)
+library(data.table)
+library(qqman)
+
+
+
cd ~/Downloads/gen_data/02_activities/data
+pwd
+head gwa.A2.fam
+
+
/c/Users/obedk/Downloads/gen_data/02_activities/data
+0 A2001 0 0 1 -0.275420523713885
+1 A2002 0 0 1 -1.99584337519063
+2 A2003 0 0 1 -0.758778643869391
+3 A2004 0 0 1 0.53728932841857
+4 A2005 0 0 1 1.13676697273246
+5 A2006 0 0 1 -0.20518361896695
+6 A2007 0 0 1 -0.0603085146427615
+7 A2008 0 0 1 0.648606850299281
+8 A2009 0 0 1 -1.31834326423139
+9 A2010 0 0 1 2.08729043554028
+
+
+
+

Question 1: Data inspection

+

Before you run any models, first get familiar with the dataset. You may find data.table::fread() in R helpful for reading .bim and .fam files.

+
    +
  1. Read the .fam file. How many samples does the dataset contain?
  2. +
+
+
# Reading the .fam file
+fam_file <- read.table("~/Downloads/gen_data/02_activities/data/gwa.A2.fam", header = FALSE)
+
+# Count the number of samples and display the result
+num_samples <- nrow(fam_file)
+print(paste("Number of samples in the dataset:", num_samples))
+
+
[1] "Number of samples in the dataset: 4000"
+
+
+
    +
  1. Read the .bim file. How many SNPs does the dataset contain?
  2. +
+
+
# Read the .bim file
+bim_file <- read.table("~/Downloads/gen_data/02_activities/data/gwa.A2.bim", header = FALSE)
+
+# Count the number of SNPs and display the result
+num_snps <- nrow(bim_file)
+print(paste("Number of SNPs in the dataset:", num_snps))
+
+
[1] "Number of SNPs in the dataset: 306102"
+
+
+
    +
  1. Make a histogram (or density plot) of the phenotype. Does it look roughly Gaussian?
  2. +
+
+
# 1. Extracting the phenotype column (6th column of the .fam file)
+phenotype <- read.table("~/Downloads/gen_data/02_activities/data/gwa.A2.fam", header = FALSE)$V6
+
+# Filtering out missing values if present (assuming -9 indicates missing phenotypes)
+phenotype_clean <- phenotype[phenotype != -9 & !is.na(phenotype)]
+
+# 2. Make a Histogram
+hist(phenotype_clean, 
+     main = "Histogram of Phenotype", 
+     xlab = "Phenotype Value", 
+     col = "lightblue", 
+     border = "black",
+     breaks = 20) 
+
+
+
+

+
+
+
+
# 3. Make a Density Plot to better visualize the distribution
+plot(density(phenotype_clean), 
+     main = "Density Plot of Phenotype", 
+     xlab = "Phenotype Value", 
+     col = "darkblue", 
+     lwd = 2)
+
+
+
+

+
+
+
+
+

Yes, the histogram (or density plot) displays a roughly symmetric, bell-shaped curve, indicating the phenotype follows a roughly Gaussian distribution.

+
+
+

Question 2: Quality control (QC)

+

Now we will perform QC using PLINK2 for the genotype files in gwa.A2.

+
    +
  1. Using PLINK2 from the command line (bash), perform basic QC with the following filters: MAF ≥ 0.05, SNP missingness (--geno) ≤ 0.01, individual missingness (--mind) ≤ 0.10, and HWE p-value ≥ 0.00005, and output the QC’ed dataset as gwa.qc.A2.
  2. +
+
+
/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.A2 --maf 0.05 --geno 0.01 --mind 0.1 --hwe 0.00005 --make-bed --out ~/Downloads/gen_data/02_activities/data/gwa.qc.A2
+
+
PLINK v2.0.0-a.7 64-bit (10 Jan 2026)               cog-genomics.org/plink/2.0/
+(C) 2005-2026 Shaun Purcell, Christopher Chang    GNU General Public License v3
+Logging to C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.log.
+Options in effect:
+  --bfile C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.A2
+  --geno 0.01
+  --hwe 0.00005
+  --maf 0.05
+  --make-bed
+  --mind 0.1
+  --out C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2
+
+Start time: Thu Apr 02 14:56:21 2026
+32479 MiB RAM detected; reserving 16239 MiB for main workspace.
+Using up to 12 threads (change this with --threads).
+4000 samples (2000 females, 2000 males; 4000 founders) loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.A2.fam.
+306102 variants loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.A2.bim.
+1 quantitative phenotype loaded (4000 values).
+Calculating sample missingness rates... 0%21%42%64%85%done.
+0 samples removed due to missing genotype data (--mind).
+4000 samples (2000 females, 2000 males; 4000 founders) remaining after main
+filters.
+4000 quantitative phenotype values remaining after main filters.
+Calculating allele frequencies... 0%21%42%64%85%done.
+--geno: 196578 variants removed due to missing genotype data.
+--hwe: 6 variants removed due to Hardy-Weinberg exact test (founders only).
+8435 variants removed due to allele frequency threshold(s)
+(--maf/--max-maf/--mac/--max-mac).
+101083 variants remaining after main filters.
+Writing C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.fam ...
+done.
+Writing C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.bim ...
+done.
+Writing C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.bed ...
+0%21%43%65%87%done.
+End time: Thu Apr 02 14:56:22 2026
+
+
+
+
+

Question 3: Relatedness

+

In this question, you will use PLINK2’s built-in KING-robust kinship (--king-cutoff) detect and remove related individuals.

+
    +
  1. Perform LD pruning on gwa.qc.A2 using PLINK2 with the following parameters: --indep-pairwise 500 50 0.05, and then generate a new dataset containing only the pruned SNPs.
  2. +
+
+
# 1. LD pruning to identify a set of approximately independent SNPs
+/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A2 --indep-pairwise 500 50 0.05 --out ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned
+
+# 2. Create a new dataset using only the pruned SNPs
+/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A2 --extract ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.prune.in --make-bed --out ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned
+
+
PLINK v2.0.0-a.7 64-bit (10 Jan 2026)               cog-genomics.org/plink/2.0/
+(C) 2005-2026 Shaun Purcell, Christopher Chang    GNU General Public License v3
+Logging to C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.log.
+Options in effect:
+  --bfile C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2
+  --indep-pairwise 500 50 0.05
+  --out C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned
+
+Start time: Thu Apr 02 14:56:22 2026
+32479 MiB RAM detected; reserving 16239 MiB for main workspace.
+Using up to 12 threads (change this with --threads).
+4000 samples (2000 females, 2000 males; 4000 founders) loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.fam.
+101083 variants loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.bim.
+1 quantitative phenotype loaded (4000 values).
+Calculating allele frequencies... 0%64%done.
+--indep-pairwise (11 compute threads): 0%50%79169/101083 variants removed.
+Writing...
+Variant lists written to
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.prune.in
+and
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.prune.out
+.
+End time: Thu Apr 02 14:56:23 2026
+PLINK v2.0.0-a.7 64-bit (10 Jan 2026)               cog-genomics.org/plink/2.0/
+(C) 2005-2026 Shaun Purcell, Christopher Chang    GNU General Public License v3
+Logging to C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.log.
+Options in effect:
+  --bfile C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2
+  --extract C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.prune.in
+  --make-bed
+  --out C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned
+
+Start time: Thu Apr 02 14:56:23 2026
+32479 MiB RAM detected; reserving 16239 MiB for main workspace.
+Using up to 12 threads (change this with --threads).
+4000 samples (2000 females, 2000 males; 4000 founders) loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.fam.
+101083 variants loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.bim.
+1 quantitative phenotype loaded (4000 values).
+--extract: 21914 variants remaining.
+21914 variants remaining after main filters.
+Writing
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.fam ...
+done.
+Writing
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.bim ...
+done.
+Writing
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.bed ...
+0%61%done.
+End time: Thu Apr 02 14:56:23 2026
+
+
+
    +
  1. Use PLINK2 on the LD-pruned dataset to identify a set of unrelated individuals up to (approximately) 2nd-degree relatives (use a kinship cutoff of 0.0884).
  2. +
+
+
/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned --king-cutoff 0.0884 --out ~/Downloads/gen_data/02_activities/data/gwa_king
+
+
PLINK v2.0.0-a.7 64-bit (10 Jan 2026)               cog-genomics.org/plink/2.0/
+(C) 2005-2026 Shaun Purcell, Christopher Chang    GNU General Public License v3
+Logging to C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_king.log.
+Options in effect:
+  --bfile C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned
+  --king-cutoff 0.0884
+  --out C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_king
+
+Start time: Thu Apr 02 14:56:23 2026
+32479 MiB RAM detected; reserving 16239 MiB for main workspace.
+Using up to 12 threads (change this with --threads).
+4000 samples (2000 females, 2000 males; 4000 founders) loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.fam.
+21914 variants loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.bim.
+1 quantitative phenotype loaded (4000 values).
+--king-cutoff pass 1/1: Scanning for rare variants... 0%done.
+0 variants handled by initial scan (21914 remaining).
+
+--king-cutoff pass 1/1: 0 variants complete.
+--king-cutoff pass 1/1: 1536 variants complete.
+--king-cutoff pass 1/1: 3072 variants complete.
+--king-cutoff pass 1/1: 4608 variants complete.
+--king-cutoff pass 1/1: 6144 variants complete.
+--king-cutoff pass 1/1: 7680 variants complete.
+--king-cutoff pass 1/1: 9216 variants complete.
+--king-cutoff pass 1/1: 10752 variants complete.
+--king-cutoff pass 1/1: 12288 variants complete.
+--king-cutoff pass 1/1: 13824 variants complete.
+--king-cutoff pass 1/1: 15360 variants complete.
+--king-cutoff pass 1/1: 16896 variants complete.
+--king-cutoff pass 1/1: 18432 variants complete.
+--king-cutoff pass 1/1: 19968 variants complete.
+--king-cutoff pass 1/1: 21504 variants complete.
+--king-cutoff pass 1/1: Condensing...                 done.
+--king-cutoff: 21914 variants processed.
+--king-cutoff: Excluded sample IDs written to
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_king.king.cutoff.out.id
+, and 4000 remaining sample IDs written to
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_king.king.cutoff.in.id
+.
+End time: Thu Apr 02 14:56:25 2026
+
+
+
    +
  1. Using the unrelated individual list from part (ii), create a dataset containing only unrelated individuals and name it gwa.qc_unrelated.A2.
  2. +
+
+
/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A2 --keep ~/Downloads/gen_data/02_activities/data/gwa_king.king.cutoff.in.id --make-bed --out ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2
+
+
PLINK v2.0.0-a.7 64-bit (10 Jan 2026)               cog-genomics.org/plink/2.0/
+(C) 2005-2026 Shaun Purcell, Christopher Chang    GNU General Public License v3
+Logging to C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2.log.
+Options in effect:
+  --bfile C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2
+  --keep C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_king.king.cutoff.in.id
+  --make-bed
+  --out C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2
+
+Start time: Thu Apr 02 14:56:25 2026
+32479 MiB RAM detected; reserving 16239 MiB for main workspace.
+Using up to 12 threads (change this with --threads).
+4000 samples (2000 females, 2000 males; 4000 founders) loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.fam.
+101083 variants loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2.bim.
+1 quantitative phenotype loaded (4000 values).
+--keep: 4000 samples remaining.
+4000 samples (2000 females, 2000 males; 4000 founders) remaining after main
+filters.
+4000 quantitative phenotype values remaining after main filters.
+Writing
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2.fam
+... done.
+Writing
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2.bim
+... done.
+Writing
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2.bed
+... 0%64%done.
+End time: Thu Apr 02 14:56:25 2026
+
+
+
+
+

Question 4: principal component analysis (PCA)

+
    +
  1. Using PLINK2, perform PCA on the unrelated, LD-pruned dataset to obtain principal components.

    +

    (Hint: Refer to the PCA section in the GWAS Tutorial II. You should use a *.prune.in file to select a set of independent SNPs before performing PCA.)

  2. +
+
+
# 1. First, create a pruned dataset of unrelated individuals
+/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2 --extract ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.prune.in --make-bed --out ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned
+
+# 2. Now perform PCA:
+/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned --pca 20 --out ~/Downloads/gen_data/02_activities/data/gwa_unrel_PCA
+
+
PLINK v2.0.0-a.7 64-bit (10 Jan 2026)               cog-genomics.org/plink/2.0/
+(C) 2005-2026 Shaun Purcell, Christopher Chang    GNU General Public License v3
+Logging to C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned.log.
+Options in effect:
+  --bfile C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2
+  --extract C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.prune.in
+  --make-bed
+  --out C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned
+
+Start time: Thu Apr 02 14:56:25 2026
+32479 MiB RAM detected; reserving 16239 MiB for main workspace.
+Using up to 12 threads (change this with --threads).
+4000 samples (2000 females, 2000 males; 4000 founders) loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2.fam.
+101083 variants loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2.bim.
+1 quantitative phenotype loaded (4000 values).
+--extract: 21914 variants remaining.
+21914 variants remaining after main filters.
+Writing
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned.fam
+... done.
+Writing
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned.bim
+... done.
+Writing
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned.bed
+... 0%61%done.
+End time: Thu Apr 02 14:56:26 2026
+PLINK v2.0.0-a.7 64-bit (10 Jan 2026)               cog-genomics.org/plink/2.0/
+(C) 2005-2026 Shaun Purcell, Christopher Chang    GNU General Public License v3
+Logging to C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_unrel_PCA.log.
+Options in effect:
+  --bfile C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned
+  --out C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_unrel_PCA
+  --pca 20
+
+Start time: Thu Apr 02 14:56:26 2026
+32479 MiB RAM detected; reserving 16239 MiB for main workspace.
+Using up to 12 threads (change this with --threads).
+4000 samples (2000 females, 2000 males; 4000 founders) loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned.fam.
+21914 variants loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned.bim.
+1 quantitative phenotype loaded (4000 values).
+Calculating allele frequencies... 0%done.
+Constructing GRM: 0%1%2%3%4%5%6%7%8%9%10%11%12%13%14%15%16%17%18%19%20%21%22%23%24%25%26%27%28%29%30%31%32%33%34%35%36%37%38%39%40%41%42%43%44%45%46%47%48%49%50%51%52%53%54%55%56%57%58%59%60%61%62%63%64%65%66%67%68%69%70%71%72%73%74%75%76%77%78%79%80%81%82%83%84%85%86%87%88%89%90%91%92%93%94%95%96%97%98%99%done.
+Correcting for missingness... 0%1%2%3%4%5%6%7%8%9%10%11%12%13%14%15%16%17%18%19%20%21%22%23%24%25%26%27%28%29%30%31%32%33%34%35%36%37%38%39%40%41%42%43%44%45%46%47%48%49%50%51%52%53%54%55%56%57%58%59%60%61%62%63%64%65%66%67%68%69%70%71%72%73%74%75%76%77%78%79%80%81%82%83%84%85%86%87%88%89%90%91%92%93%94%95%96%97%98%99%done.
+Extracting eigenvalues and eigenvectors... done.
+--pca: Eigenvectors written to
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_unrel_PCA.eigenvec ,
+and eigenvalues written to
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_unrel_PCA.eigenval .
+End time: Thu Apr 02 14:56:34 2026
+
+
+
+
+

Question 5: GWAS analyses

+

We now test for association between each SNP and the continuous phenotype, adjusting for population structure using the top 3 PCs.

+

Assume that:

+
    +
  • You will run GWAS on the unrelated, QC’ed dataset gwa.qc_unrelated.A2.

  • +
  • You have a covariate file (e.g., the *.eigenvec output from the PCA analysis) containing PC1–PC3 for each individual.

  • +
+
    +
  1. Using PLINK2, run a linear regression GWAS using gwa.qc_unrelated.A2 as the input dataset. Adjust for PCs 1–3 as covariates.
  2. +
+
+
/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2 --ci 0.95 --glm --covar ~/Downloads/gen_data/02_activities/data/gwa_unrel_PCA.eigenvec --covar-name PC1,PC2,PC3 --adjust --out ~/Downloads/gen_data/02_activities/data/gwa.qc_assoc_glm
+
+
PLINK v2.0.0-a.7 64-bit (10 Jan 2026)               cog-genomics.org/plink/2.0/
+(C) 2005-2026 Shaun Purcell, Christopher Chang    GNU General Public License v3
+Logging to C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_assoc_glm.log.
+Options in effect:
+  --adjust
+  --bfile C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2
+  --ci 0.95
+  --covar C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_unrel_PCA.eigenvec
+  --covar-name PC1,PC2,PC3
+  --glm
+  --out C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_assoc_glm
+
+Start time: Thu Apr 02 14:56:34 2026
+32479 MiB RAM detected; reserving 16239 MiB for main workspace.
+Using up to 12 threads (change this with --threads).
+4000 samples (2000 females, 2000 males; 4000 founders) loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2.fam.
+101083 variants loaded from
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2.bim.
+1 quantitative phenotype loaded (4000 values).
+3 covariates loaded from C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa_unrel_PCA.eigenvec.
+Calculating allele frequencies... 0%64%done.
+--glm linear regression on phenotype 'PHENO1': 0%64%done.
+Results written to C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_assoc_glm.PHENO1.glm.linear .
+--adjust: Genomic inflation est. lambda (based on median chisq) = 1.01779.
+--adjust values (101083 tests) written to
+C:/Users/obedk/Downloads/gen_data/02_activities/data/gwa.qc_assoc_glm.PHENO1.glm.linear.adjusted
+.
+End time: Thu Apr 02 14:56:36 2026
+
+
+
    +
  1. Create a Manhattan plot of the GWAS results.
  2. +
+
+
# Load PLINK2 logistic results
+assoc <- data.table::fread("~/Downloads/gen_data/02_activities/data/gwa.qc_assoc_glm.PHENO1.glm.linear")
+
+head(assoc)
+
+
   #CHROM     POS        ID    REF    ALT PROVISIONAL_REF?     A1 OMITTED
+    <int>   <int>    <char> <char> <char>           <char> <char>  <char>
+1:      1 1011278 rs3737728      G      A                Y      A       G
+2:      1 1011278 rs3737728      G      A                Y      A       G
+3:      1 1011278 rs3737728      G      A                Y      A       G
+4:      1 1011278 rs3737728      G      A                Y      A       G
+5:      1 1109721 rs1320565      C      T                Y      T       C
+6:      1 1109721 rs1320565      C      T                Y      T       C
+     A1_FREQ   TEST OBS_CT       BETA        SE        L95       U95    T_STAT
+       <num> <char>  <int>      <num>     <num>      <num>     <num>     <num>
+1: 0.3386490    ADD   3982  0.0182086 0.0240795 -0.0289864 0.0654035  0.756187
+2: 0.3386490    PC1   3982 -0.3779240 1.0015500 -2.3409200 1.5850800 -0.377340
+3: 0.3386490    PC2   3982  0.9818050 1.0015100 -0.9811150 2.9447300  0.980326
+4: 0.3386490    PC3   3982  0.4832040 1.0015300 -1.4797500 2.4461600  0.482467
+5: 0.0788481    ADD   3976 -0.0153297 0.0420641 -0.0977739 0.0671145 -0.364436
+6: 0.0788481    PC1   3976 -0.4762890 1.0037500 -2.4436000 1.4910200 -0.474511
+          P ERRCODE
+      <num>  <char>
+1: 0.449582       .
+2: 0.705941       .
+3: 0.326985       .
+4: 0.629501       .
+5: 0.715552       .
+6: 0.635162       .
+
+
# Keep only the additive test (one row per SNP)
+assoc_add <- assoc[TEST == "ADD"]
+
+# qqman expects columns named CHR, BP, SNP, and P.
+# In PLINK2 output they are #CHROM, POS, ID, and P.
+setnames(assoc_add, c("#CHROM","POS","ID"), c("CHR","BP","SNP"))
+
+# Manhattan plot
+manhattan(assoc_add,
+          chr = "CHR",
+          bp  = "BP",
+          snp = "SNP",
+          p   = "P",
+          xlab = "",
+          ylab = "",
+          suggestiveline = FALSE,
+          cex.axis = 1.5,
+          col = c("lightblue", "lightslateblue"))
+
+
+
+

+
+
+
+
+
    +
  1. Create a QQ plot of the GWAS p-values.
  2. +
+
+
# Q-Q plot
+qq(assoc_add$P, main = "Q-Q plot of GWAS p-values")
+
+
+
+

+
+
+
+
+
+
+

Criteria

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CriteriaCompleteIncomplete
Data inspectionCorrect sample and SNP counts; phenotype plot with a brief comment on Gaussianity.Counts or phenotype description/plot missing or incorrect.
QC & LD pruningCorrect PLINK2 QC command and thresholds.QC/pruning commands, thresholds, or output datasets missing or incorrect.
Relatedness & PCACorrect use of PLINK2 command to obtain unrelated samples and PCA run on pruned SNPs.Relatedness step, unrelated dataset, or PCA analysis missing or incorrect.
GWAS & visualisationLinear regression GWAS with PCs as covariates; Manhattan and QQ plots produced.GWAS command, or Manhattan/QQ plots missing or clearly incorrect.
+
+
+

Submission Information

+

🚨 Please review our Assignment Submission Guide 🚨 for detailed instructions on how to format, branch, and submit your work. Following these guidelines is crucial for your submissions to be evaluated correctly.

+
+
+

Submission Parameters

+
    +
  • Submission Due Date: 11:59 PM – 01/04/2026

  • +
  • The branch name for your repo should be: assignment-2

  • +
  • What to submit for this assignment:

    +
      +
    • Populate this Quarto document (assignment_2.qmd).
    • +
    • Render the document with Quarto: quarto render assignment_2.qmd.
    • +
    • Submit both assignment_2.qmd and the rendered HTML file assignment_2.html in your pull request.
    • +
  • +
  • What the pull request link should look like for this assignment: https://github.com/<your_github_username>/gen_data/pull/<pr_id>

    +
      +
    • Open a private window in your browser. Copy and paste the link to your pull request into the address bar. Make sure you can see your pull request properly. This helps the technical facilitator and learning support team review your submission easily.
    • +
  • +
+
+

Checklist:

+
    +
  • Create a branch called assignment-2.
  • +
  • Ensure that your repository is public.
  • +
  • Review the PR description guidelines and adhere to them.
  • +
  • Verify that your link is accessible in a private browser window.
  • +
  • Confirm that both assignment_2.qmd and assignment_2.html are included in the pull request.
  • +
+
+
+ +
+ + +
+ + + + + \ No newline at end of file diff --git a/02_activities/assignments/assignment_2.qmd b/02_activities/assignments/assignment_2.qmd index fd93722..4629d49 100644 --- a/02_activities/assignments/assignment_2.qmd +++ b/02_activities/assignments/assignment_2.qmd @@ -5,6 +5,31 @@ format: html You will need **PLINK2** installed and available in your PATH. Please follow the OS-specific setup guide in [`SETUP.md`](../../SETUP.md). The dataset for this assignment consists of the following binary PLINK files: `gwa.A2.bed`, `gwa.A2.bim`, `gwa.A2.fam` , available at the following Google Drive link: . Please download all three files and save them in `02_activities/data/`. + +```{r setup, include=FALSE} +# Set up a consistent path for all chunks of code +knitr::opts_knit$set(root.dir = normalizePath("../../")) + +# Force Quarto to use Git Bash for all {bash} chunks +knitr::opts_chunk$set(engine.path = list(bash = "C:/Program Files/Git/bin/bash.exe")) +``` + +```{r, message=FALSE, warning=FALSE, results='hide'} +library(data.table) +library(ggplot2) +library(seqminer) +library(HardyWeinberg) +library(dplyr) +library(data.table) +library(qqman) +``` + +```{bash} +cd ~/Downloads/gen_data/02_activities/data +pwd +head gwa.A2.fam +``` + #### Question 1: Data inspection Before you run any models, first get familiar with the dataset. You may find `data.table::fread()` in R helpful for reading `.bim` and `.fam` files. @@ -12,20 +37,50 @@ Before you run any models, first get familiar with the dataset. You may find `da (i) Read the `.fam` file. How many samples does the dataset contain? ```{r} -# Your code here... +# Reading the .fam file +fam_file <- read.table("~/Downloads/gen_data/02_activities/data/gwa.A2.fam", header = FALSE) + +# Count the number of samples and display the result +num_samples <- nrow(fam_file) +print(paste("Number of samples in the dataset:", num_samples)) ``` (ii) Read the `.bim` file. How many SNPs does the dataset contain? ```{r} -# Your code here... +# Read the .bim file +bim_file <- read.table("~/Downloads/gen_data/02_activities/data/gwa.A2.bim", header = FALSE) + +# Count the number of SNPs and display the result +num_snps <- nrow(bim_file) +print(paste("Number of SNPs in the dataset:", num_snps)) ``` (iii) Make a histogram (or density plot) of the phenotype. Does it look roughly Gaussian? ```{r} -# Your code here... +# 1. Extracting the phenotype column (6th column of the .fam file) +phenotype <- read.table("~/Downloads/gen_data/02_activities/data/gwa.A2.fam", header = FALSE)$V6 + +# Filtering out missing values if present (assuming -9 indicates missing phenotypes) +phenotype_clean <- phenotype[phenotype != -9 & !is.na(phenotype)] + +# 2. Make a Histogram +hist(phenotype_clean, + main = "Histogram of Phenotype", + xlab = "Phenotype Value", + col = "lightblue", + border = "black", + breaks = 20) + +# 3. Make a Density Plot to better visualize the distribution +plot(density(phenotype_clean), + main = "Density Plot of Phenotype", + xlab = "Phenotype Value", + col = "darkblue", + lwd = 2) ``` +Yes, the histogram (or density plot) displays a roughly symmetric, bell-shaped curve, indicating the phenotype follows a roughly Gaussian distribution. #### Question 2: Quality control (QC) @@ -34,7 +89,7 @@ Now we will perform QC using PLINK2 for the genotype files in `gwa.A2`. (i) Using PLINK2 from the command line (bash), perform basic QC with the following filters: MAF ≥ 0.05, SNP missingness (`--geno`) ≤ 0.01, individual missingness (`--mind`) ≤ 0.10, and HWE p-value ≥ 0.00005, and output the QC’ed dataset as `gwa.qc.A2`. ```{bash} -# Your code here... +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.A2 --maf 0.05 --geno 0.01 --mind 0.1 --hwe 0.00005 --make-bed --out ~/Downloads/gen_data/02_activities/data/gwa.qc.A2 ``` #### Question 3: Relatedness @@ -44,19 +99,23 @@ In this question, you will use **PLINK2’s built-in KING-robust kinship** (`--k i) Perform LD pruning on `gwa.qc.A2` using PLINK2 with the following parameters: `--indep-pairwise 500 50 0.05`, and then generate a new dataset containing only the pruned SNPs. ```{bash} -# Your code here... +# 1. LD pruning to identify a set of approximately independent SNPs +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A2 --indep-pairwise 500 50 0.05 --out ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned + +# 2. Create a new dataset using only the pruned SNPs +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A2 --extract ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.prune.in --make-bed --out ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned ``` (ii) Use PLINK2 on the LD-pruned dataset to identify a set of unrelated individuals up to (approximately) 2nd-degree relatives (use a kinship cutoff of 0.0884). ```{bash} -# Your code here... +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned --king-cutoff 0.0884 --out ~/Downloads/gen_data/02_activities/data/gwa_king ``` (iii) Using the unrelated individual list from part (ii), create a dataset containing only unrelated individuals and name it `gwa.qc_unrelated.A2`. ```{bash} -# Your code here... +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc.A2 --keep ~/Downloads/gen_data/02_activities/data/gwa_king.king.cutoff.in.id --make-bed --out ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2 ``` #### Question 4: principal component analysis (PCA) @@ -66,7 +125,11 @@ i) Perform LD pruning on `gwa.qc.A2` using PLINK2 with the following parameters (Hint: Refer to the PCA section in the GWAS Tutorial II. You should use a `*.prune.in` file to select a set of independent SNPs before performing PCA.) ```{bash} -# Your code here... +# 1. First, create a pruned dataset of unrelated individuals +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2 --extract ~/Downloads/gen_data/02_activities/data/gwa.qc.A2_pruned.prune.in --make-bed --out ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned + +# 2. Now perform PCA: +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated_pruned --pca 20 --out ~/Downloads/gen_data/02_activities/data/gwa_unrel_PCA ``` #### Question 5: GWAS analyses @@ -82,19 +145,42 @@ Assume that: (i) Using PLINK2, run a linear regression GWAS using `gwa.qc_unrelated.A2` as the input dataset. Adjust for PCs 1–3 as covariates. ```{bash} -# Your code here... +/c/PLINK/plink2.exe --bfile ~/Downloads/gen_data/02_activities/data/gwa.qc_unrelated.A2 --ci 0.95 --glm --covar ~/Downloads/gen_data/02_activities/data/gwa_unrel_PCA.eigenvec --covar-name PC1,PC2,PC3 --adjust --out ~/Downloads/gen_data/02_activities/data/gwa.qc_assoc_glm ``` (ii) Create a Manhattan plot of the GWAS results. ```{r} -# Your code here... +# Load PLINK2 logistic results +assoc <- data.table::fread("~/Downloads/gen_data/02_activities/data/gwa.qc_assoc_glm.PHENO1.glm.linear") + +head(assoc) + +# Keep only the additive test (one row per SNP) +assoc_add <- assoc[TEST == "ADD"] + +# qqman expects columns named CHR, BP, SNP, and P. +# In PLINK2 output they are #CHROM, POS, ID, and P. +setnames(assoc_add, c("#CHROM","POS","ID"), c("CHR","BP","SNP")) + +# Manhattan plot +manhattan(assoc_add, + chr = "CHR", + bp = "BP", + snp = "SNP", + p = "P", + xlab = "", + ylab = "", + suggestiveline = FALSE, + cex.axis = 1.5, + col = c("lightblue", "lightslateblue")) ``` (iii) Create a QQ plot of the GWAS p-values. ```{r} -# Your code here... +# Q-Q plot +qq(assoc_add$P, main = "Q-Q plot of GWAS p-values") ``` ### Criteria From 94baf6fb7f0967d5ea3848b1f6198f86ca68664d Mon Sep 17 00:00:00 2001 From: obedmortey Date: Thu, 2 Apr 2026 16:46:24 -0230 Subject: [PATCH 3/3] Add files via upload --- .../assignments/unnamed-chunk-12-1.png | Bin 0 -> 18964 bytes .../assignments/unnamed-chunk-13-1.png | Bin 0 -> 14603 bytes 02_activities/assignments/unnamed-chunk-5-1.png | Bin 0 -> 15848 bytes 02_activities/assignments/unnamed-chunk-5-2.png | Bin 0 -> 14228 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 02_activities/assignments/unnamed-chunk-12-1.png create mode 100644 02_activities/assignments/unnamed-chunk-13-1.png create mode 100644 02_activities/assignments/unnamed-chunk-5-1.png create mode 100644 02_activities/assignments/unnamed-chunk-5-2.png diff --git a/02_activities/assignments/unnamed-chunk-12-1.png b/02_activities/assignments/unnamed-chunk-12-1.png new file mode 100644 index 0000000000000000000000000000000000000000..47a2554d48cd979f28b84a8403391b647ac65b10 GIT binary patch literal 18964 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 P0UtRj<(H)|jNknq__umX literal 0 HcmV?d00001 diff --git a/02_activities/assignments/unnamed-chunk-13-1.png b/02_activities/assignments/unnamed-chunk-13-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcf552d59a61d48ced176420c0338cb287d75c5 GIT binary patch literal 14603 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%0ADVn)rS&&X_B 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 literal 0 HcmV?d00001 diff --git a/02_activities/assignments/unnamed-chunk-5-2.png b/02_activities/assignments/unnamed-chunk-5-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d45bf7cd115533dfac0bec76a80bdee872bbeba0 GIT binary patch literal 14228 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 literal 0 HcmV?d00001