Projects

A list of projects that I have completed throughout my classes.

Neuropsychiatric Symptoms in Late Onset Alzheimer’s Disease & Down Syndrome Alzheimer’s Disease

Currently ongoing.

Weather Data Candle Plot

This was my final project in my INFO 474 course Interactive Information Visualization. The goal of the project was to use weather data and create a completely different plot that answered a specific user question.

The user question that my candle plot answered was related to a weather forecaster attempting to ascertain the maximum, minimum, and average temperatures for a modifiable date range.

The visualization is coded in HTML, CSS, and Javascript. A viewer can click and drag on the plot area to zoom in to a certain date range, and can double click anywhere to zoom back out. The drop down menu can be used to switch between different cities’ weather data. Finally, the top of the candle is the maximum temperature for that day, the bottom of the candle is the minimum temperature for that day, and the black line is the average temperature for that day. The candle is red if the maximum temperature is greater than the minimum temperature, and blue for the opposite.

Here’s the link: Weather Data Candle Plot.

MOM & MLE Estimation for COVID Vaccine

This was my final group project in my STAT 342 course Introduction to Probability and Mathematical Statistics III. The goal of the project was to create and use Method of Moments (MOM) and Maximum Likelihood Estimators (MLE) to find out the efficacy of the BNT162b2 COVID-19 vaccine.

The estimators and graphs were coded in R, and the final project report is linked here: MOM & MLE Estimation for COVID Vaccine Final Report.

Health & Fitness Tracker

The was my final group project in my INFO 330 course Client-Side Web Development. The purpose of the project was to create an interactive web application, for which my group and I created a fitness and workout app that allows for users to log in and record both their food intake and workouts.

This web application was coded in HTML, CSS, and Javascript, and was then hosted on Firebase. The link to this app is here: Health & Fitness Tracker.

LGBTQIA+ Cartoon Analysis

This was my final group project in my INFO 201 course Foundational Skills for Data Science. The aim of the project was to analyze the presence of LGBTQIA+ characters in children’s cartoons.

This analysis contains three interactive visualizations, which are coded in R as a Shiny app. The link to the Shiny app is: LGBTQIA+ Cartoon Analysis Shiny App.

Fish Population Analysis

This was my final group project in my AMATH 383 course Introduction to Continuous Mathematical Modeling. The goal of this project was to measure the accuracy of the base logistical model against actual fish populations over time.

The plots for this project were coded in Python, and the final project report is linked here: Fish Population Analysis Final Report.

Nintendo SQL Database

This was my final project in my INFO 330 course Data and Data Modeling. The goal of this project was to create a complicated database and then answer user queries for said database. This database of Nintendo video games and game bundles as well as the resulting user queries are coded in SQL.

The proposal document for the project, which outlines the information needs for the database as well as the main entities, is linked here: Nintendo SQL Database Proposal Document.

The Excel database that I manually created to represent the various Nintendo games is linked here: Nintendo SQL Excel Database.

The Phase 1 Entity-Relationship Diagram (ERD), along with the Phase 2 Relational Schema for the database are additionally linked below:

Phase 1 ERD

Phase 2 Relational Schema

The final project file that includes a summary of the database as well as all of the user queries and their respective results is linked here: Nintendo SQL Database Final Project Summary.

Statistics Directed Reading Program 2023

This was the project that I completed during the Statistics Directed Reading Program in my 2023 spring quarter at the University of Washington. I was taught about the topic of random walks from a graduate student and then presented what I learned to a group of fellow students from the directed reading program as well as statistics professors.

Below is my summary document of what I understood as well as the presentation that I presented to my fellow students and the statistics professors:

Random Walks Summary Document

Random Walks Presentation

Additionally, below is my R code for graphically demonstrating random walks as well as calculating their convergence:

#install.packages("igraph")
#install.packages("expm")
library(expm)
library(igraph)

# First set up a symmetric random walk

sym_walk <- function(x0, n)
{
  values <- c(0)
  current <- x0
  while (length(values) < n)
  {
    change = 0
    if (runif(1) > 0.5)
    {
      change = 1
    }
    else
    {
      change = -1
    }
    current <- current + change
    values <- c(values, current)
  }
  values
}

plot(sym_walk(0, 100), xlab ="Number of Steps (n)",
     ylab = "Sn", main = "Simple Symmetric Random
     Walk with Probability p = 0.5", type = "l")

# Second set up a random walk without symmetry

prob_walk <- function(x0, p, n)
{
  values <- c(0)
  current <- x0
  while (length(values) < n)
  {
    change = 0
    if (runif(1) > p)
    {
      change = 1
    }
    else
    {
      change = -1
    }
    current <- current + change
    values <- c(values, current)
    }
  values
}

plot(prob_walk(0, 0.25, 100), xlab =
    "Number of Steps (n)", ylab = "Sn", 
    main = "Simple Symmetric Random
     Walk with Probability p = 0.25", type = "l")

# Third graph random walk on graph w/ equal prob

G <- make_graph(~ 1 - 2, 3 - 4, 4 - 1:2, 5 - 1:2:3)
plot(G, vertex.color = "green")

# Degree Matrix of Graph G
deg <- degree(G)
G_deg <- diag(deg, 5, 5)

# Adjacency Matrix of Graph G
G_adj <- matrix(as_adj(G), byrow = FALSE, nrow = 5)

# Manually Computed Laplacian
G_man_lap <- G_deg - G_adj

# Computer Computed Laplacian
G_com_lap <- matrix(laplacian_matrix(G), 
                    byrow = FALSE, nrow = 5)

# Manually Computed Normalized Laplacian
deg_neg_half <- degree(G)^(-0.5)
G_deg_neg_half <- diag(deg_neg_half, 5, 5)
G_man_norm_lap <- G_deg_neg_half %*% G_man_lap %*%
  G_deg_neg_half

# Computer Computer Normalized Laplacian
G_com_norm_lap <- matrix(laplacian_matrix(G, 
                        normalized = TRUE), 
                         byrow = FALSE, nrow = 5)

# That proves the Laplacian matrix as well as our
# equation to normalize it.

# Now to do some stuff with the original M matrix
H <- make_graph(~ A - B:C, B - C:D)
plot(H, vertex.color = "light blue")

trans_prob_step <- function(graph, t)
{
  nodes = vcount(graph)
  d <- degree(graph)
  M <- matrix(0, nodes, nodes)
  for (i in 1:nodes)
  {
    for (j in 1:nodes)
    {
      if (are_adjacent(graph, i, j) == TRUE)
      {
        M[i, j] = 1/d[i]
      }
      else
      {
        M[i, j] = 0
      }
    }
  }
  if (t == 0)
  {
    print("Invalid Operation.")
  }
  else if (t == 1)
  {
    M <- M
  }
  else
  {
    for (k in 1:(t-1))
    {
      M <- M %*% M
    }
  }
  N <- M
}

N <- trans_prob_step(H, 2)

prob_cloud <- function(graph, t, i)
{
  A <- trans_prob_step(graph, t)
  v <- A[i,]
  v
}

row <- prob_cloud(H, 2, 1)

lazy_matrix_step <- function(graph, t)
{
  nodes = vcount(graph)
  d <- degree(graph)
  M <- matrix(0, nodes, nodes)
  if (runif(1) > 0.5)
  {
    for (i in 1:nodes)
    {
      for (j in 1:nodes)
      {
        if (are_adjacent(graph, i, j) == TRUE)
        {
          M[i, j] = 1/d[i]
        }
        else
        {
          M[i, j] = 0
        }
      }
    }
  }
  else
  {
    M <- diag(nodes)
  }
  if (t >= 2)
  {
    k = 1
    while (k < t)
    {
      S <- matrix(0, nodes, nodes)
      if (runif(1) > 0.5)
      {
        for (i in 1:nodes)
        {
          for (j in 1:nodes)
          {
            if (are_adjacent(graph, i, j) == TRUE)
            {
              S[i, j] = 1/d[i]
            }
            else
            {
              S[i, j] = 0
            }
          }
        }
      }
      else
      {
        S <- diag(nodes)
      }
      M = M %*% S
      k = k + 1
    }
  }
  A <- M
}

L <- lazy_matrix_step(H, 2)

I <- make_graph(~ a - b, c - a:b, d - a:b, e - a:c)
plot(I, vertex.color = "light green")

convergence <- function(graph)
{
  nodes = vcount(graph)
  val = 1
  R <- trans_prob_step(graph, val)
  while ((R[1, 1] + R[2, 1]) != (2 * R[1, 1]))
  {
    val = val + 1
    R <- trans_prob_step(graph, val)
  }
  val
}

num <- convergence(I)

converg_matrix <- function(graph)
{
  t <- convergence(graph)
  R <- trans_prob_step(graph, t)
  R
}

decomp_trans_prob <- function(graph, p)
{
  M <- trans_prob_step(graph, 1)
  nodes = vcount(graph)
  deg <- degree(graph)
  D <- diag(deg, nodes, nodes)
  half_D <- diag(degree(graph)^(0.5), nodes, nodes)
  neg_half_D <- diag(degree(graph)^(-0.5), 
                     nodes, nodes)
  S <- half_D %*% M %*% neg_half_D
  evs <- eigen(S)
  evals <- evs$values
  evects <- evs$vectors
  lambda <- diag(evals, nodes, nodes)
  phi <- neg_half_D %*% evects
  psi <- half_D %*% evects
  E <- matrix(0, nodes, nodes)
  for (a in 1:nodes)
  {
    r <- t(t(phi[,a]))
    y <- t(psi[,a])
    E <- E + ((evals[a]^p) * r %*% y)
  }
  E <- round(E, digits = 7)
}

E <- decomp_trans_prob(H, 2)
M <- trans_prob_step(H, 2)

J <- make_graph(~ 1 - 2:3, 2 - 3:4, 3 - 4:5, 4 - 5)
plot(J, vertex.color = "light green")

F <- converg_matrix(J)
power <- convergence(J)
P <- trans_prob_step(J, 9)