Activity 3.3 - PCA implementation

SUBMISSION INSTRUCTIONS

  1. Render to html
  2. Publish your html to RPubs
  3. Submit a link to your published solutions

Problem 1

Consider the following 6 eigenvalues from a \(6\times 6\) correlation matrix:

\[\lambda_1 = 3.5, \lambda_2 = 1.0, \lambda_3 = 0.7, \lambda_4 = 0.4, \lambda_5 = 0.25, \lambda_6 = 0.15\]

If you want to retain enough principal components to explain at least 90% of the variability inherent in the data set, how many should you keep?

would need to keep at least 4 pc’s.

Problem 2

The iris data set is a classic data set often used to demonstrate PCA. Each iris in the data set contained a measurement of its sepal length, sepal width, petal length, and petal width. Consider the five irises below, following mean-centering and scaling:

library(tidyverse)
library(GGally)
library(factoextra)
library(patchwork)
five_irises <- data.frame(
  row.names = 1:5,
  Sepal.Length = c(0.189, 0.551, -0.415, 0.310, -0.898),
  Sepal.Width  = c(-1.97, 0.786, 2.62, -0.590, 1.70),
  Petal.Length = c(0.137, 1.04, -1.34, 0.534, -1.05),
  Petal.Width  = c(-0.262, 1.58, -1.31, 0.000875, -1.05)
) %>% as.matrix

Consider also the loadings for the first two principal components:

# Create the data frame
pc_loadings <- data.frame(
  PC1 = c(0.5210659, -0.2693474, 0.5804131, 0.5648565),
  PC2 = c(-0.37741762, -0.92329566, -0.02449161, -0.06694199),
  row.names = c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")
) %>% as.matrix

A plot of the first two PC scores for these five irises is shown in the plot below.

Match the ID of each iris (1-5) to the correct letter of its score coordinates on the plot.

a->4 b->2 c->5 d->3 e->1

Problem 3

These data are taken from the Places Rated Almanac, by Richard Boyer and David Savageau, copyrighted and published by Rand McNally. The nine rating criteria used by Places Rated Almanac are:

  • Climate & Terrain
  • Housing
  • Health Care & Environment
  • Crime
  • Transportation
  • Education
  • The Arts
  • Recreation
  • Economics

For all but two of the above criteria, the higher the score, the better. For Housing and Crime, the lower the score the better. The scores are computed using the following component statistics for each criterion (see the Places Rated Almanac for details):

  • Climate & Terrain: very hot and very cold months, seasonal temperature variation, heating- and cooling-degree days, freezing days, zero-degree days, ninety-degree days.
  • Housing: utility bills, property taxes, mortgage payments.
  • Health Care & Environment: per capita physicians, teaching hospitals, medical schools, cardiac rehabilitation centers, comprehensive cancer treatment centers, hospices, insurance/hospitalization costs index, flouridation of drinking water, air pollution.
  • Crime: violent crime rate, property crime rate.
  • Transportation: daily commute, public transportation, Interstate highways, air service, passenger rail service.
  • Education: pupil/teacher ratio in the public K-12 system, effort index in K-12, accademic options in higher education.
  • The Arts: museums, fine arts and public radio stations, public television stations, universities offering a degree or degrees in the arts, symphony orchestras, theatres, opera companies, dance companies, public libraries.
  • Recreation: good restaurants, public golf courses, certified lanes for tenpin bowling, movie theatres, zoos, aquariums, family theme parks, sanctioned automobile race tracks, pari-mutuel betting attractions, major- and minor- league professional sports teams, NCAA Division I football and basketball teams, miles of ocean or Great Lakes coastline, inland water, national forests, national parks, or national wildlife refuges, Consolidated Metropolitan Statistical Area access.
  • Economics: average household income adjusted for taxes and living costs, income growth, job growth.

In addition to these, latitude and longitude, population and state are also given, but should not be included in the PCA.

Use PCA to identify the major components of variation in the ratings among cities.

places <- read.csv('Data/Places.csv')
head(places)
                       City Climate Housing HlthCare Crime Transp Educ Arts
1                 AbileneTX     521    6200      237   923   4031 2757  996
2                   AkronOH     575    8138     1656   886   4883 2438 5564
3                  AlbanyGA     468    7339      618   970   2531 2560  237
4 Albany-Schenectady-TroyNY     476    7908     1431   610   6883 3399 4655
5             AlbuquerqueNM     659    8393     1853  1483   6558 3026 4496
6              AlexandriaLA     520    5819      640   727   2444 2972  334
  Recreat Econ      Long     Lat    Pop
1    1405 7633  -99.6890 32.5590 110932
2    2632 4350  -81.5180 41.0850 660328
3     859 5250  -84.1580 31.5750 112402
4    1617 5864  -73.7983 42.7327 835880
5    2612 5727 -106.6500 35.0830 419700
6    1018 5254  -92.4530 31.3020 135282

A.

If you want to explore this data set in lower dimensional space using the first \(k\) principal components, how many would you use, and what percent of the total variability would these retained PCs explain? Use a scree plot to help you answer this question.

I would probably go with 4, mostly because the difference between 4 and 5 are not that much difference so gives me a decent stopping point. this would explain 70% of the variation in my data.

library(tidyverse)
numeric_variables_place <- places %>% select(Climate:Pop)
rownames(numeric_variables_place) <- places$City #Useful for subsequent point labeling
place_pca <- prcomp(numeric_variables_place, scale. = TRUE)
summary(place_pca)
Importance of components:
                          PC1    PC2    PC3     PC4     PC5     PC6     PC7
Standard deviation     2.0237 1.3473 1.2312 1.01743 0.97214 0.83769 0.76038
Proportion of Variance 0.3413 0.1513 0.1263 0.08626 0.07875 0.05848 0.04818
Cumulative Proportion  0.3413 0.4926 0.6189 0.70515 0.78390 0.84238 0.89056
                           PC8     PC9    PC10   PC11   PC12
Standard deviation     0.66287 0.59882 0.54492 0.3567 0.3019
Proportion of Variance 0.03662 0.02988 0.02475 0.0106 0.0076
Cumulative Proportion  0.92717 0.95706 0.98180 0.9924 1.0000
fviz_eig(place_pca, geom='line') +
  theme_classic(base_size = 16)

B.

Interpret the retained principal components by examining the loadings (plot(s) of the loadings may be helpful). Which variables will be used to separate cities along the first and second principal axes, and how? Make sure to discuss the signs of the loadings, not just their contributions!

we will separate the cities along the 1st and 2nd pc’s by pc1 looking at the extreme ends of positiviity amongst all variables. while pc1 will examine howe crime and education differs. It also examines howthe lat and longitude of the data affects how the variability is measured. though I would question the relevancy of that.

loadings_df_place <- data.frame(place_pca$rotation) %>% 
  rownames_to_column('Variable')

base_plot_place <- ggplot(loadings_df_place) + 
  theme_classic(base_size = 12) +
  theme(axis.text.x = element_text(angle = 45,hjust=1,vjust=1)) + 
  labs(x = 'Variable') + 
  geom_hline(aes(yintercept= 0), linetype=2)
l1 <- base_plot_place + 
  geom_col(aes(x = reorder(Variable,PC1, decreasing=TRUE), y = PC1))
l2 <- base_plot_place+
  geom_col(aes(x = reorder(Variable,PC2, decreasing=TRUE), y = PC2))  
l3 <- base_plot_place + 
  geom_col(aes(x = reorder(Variable,PC3, decreasing=TRUE), y = PC3))  
l4 <- base_plot_place + 
  geom_col(aes(x = reorder(Variable,PC4, decreasing=TRUE), y = PC4))  
(l1+l2)/(l3+l4)# +

  #plot_annotation(title = 'Loadings plots for fast food PCA, yes I stole your code, Yes i\'m shameless.',
   #               theme= theme(plot.title = element_text(hjust = 0.5)))

C.

Add the first two PC scores to the places data set. Create a biplot of the first 2 PCs, using repelled labeling to identify the cities. Which are the outlying cities and what characteristics make them unique?

welp, I tried to make the conversion on this one, but I couldn’t figure out how to set this code up correctly to plot this, I took my code from question 4D. I’m really not sure why I’m not getting to work, but it’s due tonight so gotta put on a good showing, I’ll at least show you my commented code to show thatt there was some effort put in.

# pc_scores_place <- as.data.frame(place_pca$x)
# bc_pca_data_place <- cbind(places, pc_scores_place)
# 
# 
# library(ggplot2)
# library(factoextra)
# 
# # Base biplot (axes only, white points)
# biplot_base <- fviz_pca(place_pca, 
#                         axes = c(1, 2), 
#                         col.ind = "white", 
#                         repel = TRUE)
# 
# # Add custom points with PC3 as size, diagnosis as color
# biplot_base +
#   geom_point(data = bc_pca_data_place,
#              aes(x = PC1, y = PC2, 
#                  color = City 
#                  ))+#,  # abs() helps visualize both high/low PC3
#              #alpha = 0.7) +
#  # labs(title = "Biplot of place statistics.(PC1 vs PC2)",
#   #     color = "City") +
#   #theme_minimal()

Problem 4

The data we will look at here come from a study of malignant and benign breast cancer cells using fine needle aspiration conducted at the University of Wisconsin-Madison. The goal was determine if malignancy of a tumor could be established by using shape characteristics of cells obtained via fine needle aspiration (FNA) and digitized scanning of the cells.

The variables in the data file you will be using are:

  • ID - patient identification number (not used in PCA)
  • Diagnosis determined by biopsy - B = benign or M = malignant
  • Radius: mean of distances from center to points on the perimeter
  • Texture: standard deviation of gray-scale values
  • Smoothness: local variation in radius lengths
  • Compactness: perimeter^2 / area - 1.0
  • Concavity: severity of concave portions of the contour
  • Concavepts: number of concave portions of the contour
  • Symmetry: measure of symmetry of the cell nucleus
  • FracDim: fractal dimension; “coastline approximation” - 1
bc_cells <- read.csv('Data/BreastDiag.csv')
head(bc_cells)
  Diagnosis Radius Texture Smoothness Compactness Concavity ConcavePts Symmetry
1         M  17.99   10.38    0.11840     0.27760    0.3001    0.14710   0.2419
2         M  20.57   17.77    0.08474     0.07864    0.0869    0.07017   0.1812
3         M  19.69   21.25    0.10960     0.15990    0.1974    0.12790   0.2069
4         M  11.42   20.38    0.14250     0.28390    0.2414    0.10520   0.2597
5         M  20.29   14.34    0.10030     0.13280    0.1980    0.10430   0.1809
6         M  12.45   15.70    0.12780     0.17000    0.1578    0.08089   0.2087
  FracDim
1 0.07871
2 0.05667
3 0.05999
4 0.09744
5 0.05883
6 0.07613

A.

My analysis suggests 3 PCs should be retained. Support or refute this suggestion. What percent of variability is explained by the first 3 PCs?

I’d say that 3 would be perfectly fine. it looks like that would explain 86% of the variance in the data, so realistically a jump to 92% is only 7% more. You might need MORE sometimes, but in this case I wouldn’t say so.

library(tidyverse)
numeric_variables <- bc_cells %>% select(Radius:FracDim)
#rownames(numeric_variables) <- bc_cells$Diagnosis #Useful for subsequent point labeling
cancer_pca <- prcomp(numeric_variables, scale. = TRUE)
summary(cancer_pca)
Importance of components:
                          PC1    PC2    PC3     PC4     PC5     PC6    PC7
Standard deviation     2.0705 1.3504 0.9087 0.70614 0.61016 0.30355 0.2623
Proportion of Variance 0.5359 0.2279 0.1032 0.06233 0.04654 0.01152 0.0086
Cumulative Proportion  0.5359 0.7638 0.8670 0.92937 0.97591 0.98743 0.9960
                           PC8
Standard deviation     0.17837
Proportion of Variance 0.00398
Cumulative Proportion  1.00000

B.

Interpret the first 3 principal components by examining the eigenvectors/loadings. Discuss.

pc1: pc1 is associated with smaller cells as all measures have a negative aspectt to them on our loadings.

pc2: is likely associated with larger uneven cells.

pc3: is likely associated with moderately sized cells that are smooth.

cancer_pca
Standard deviations (1, .., p=8):
[1] 2.0705378 1.3503646 0.9086939 0.7061387 0.6101579 0.3035518 0.2622598
[8] 0.1783697

Rotation (n x k) = (8 x 8):
                   PC1         PC2         PC3           PC4         PC5
Radius      -0.3003952  0.52850910  0.27751200 -0.0449523963  0.04245937
Texture     -0.1432175  0.35378530 -0.89839046 -0.0002176232  0.21581443
Smoothness  -0.3482386 -0.32661945  0.12684205  0.1097614573  0.84332416
Compactness -0.4584098 -0.07219238 -0.02956419  0.1825835334 -0.23762997
Concavity   -0.4508935  0.12707085  0.04245883  0.1571126948 -0.30459047
ConcavePts  -0.4459288  0.22823091  0.17458320  0.0608428515  0.01923459
Symmetry    -0.3240333 -0.28112508 -0.08456832 -0.8897711849 -0.11359240
FracDim     -0.2251375 -0.57996072 -0.24389523  0.3640273309 -0.27912206
                     PC6         PC7          PC8
Radius      -0.518437923  0.36152546 -0.387460874
Texture     -0.006127134  0.02418201  0.004590238
Smoothness   0.079444068 -0.04732075 -0.155456892
Compactness -0.388065805 -0.73686177  0.020239147
Concavity    0.700061530  0.02347868 -0.413095816
ConcavePts   0.125314641  0.21313047  0.808318445
Symmetry    -0.018262848  0.05764443 -0.023810142
FracDim     -0.261064577  0.52365191 -0.026129456

C.

Examine a biplot of the first two PCs. Incorporate the third PC by sizing the points by this variable. (Hint: use fviz_pca to set up a biplot, but set col.ind='white'. Then use geom_point() to maintain full control over the point mapping.) Color-code by whether the cells are benign or malignant. Answer the following:

  • What characteristics distinguish malignant from benign cells?
  • Of the 3 PCs, which does the best job of differentiating malignant from benign cells?

Malign cells are more commonly associated with concavity, texture, and a larger radiuses. Benign cells have a smaller all of that and are more closely aligned with being a smoother cell.

pc1 does the best as it explains 53% of the overall variation.

pc_scores <- as.data.frame(cancer_pca$x)
bc_pca_data <- cbind(bc_cells, pc_scores)


library(ggplot2)
library(factoextra)

# Base biplot (axes only, white points)
biplot_base <- fviz_pca(cancer_pca, 
                        axes = c(1, 2), 
                        col.ind = "white", 
                        repel = TRUE)

# Add custom points with PC3 as size, diagnosis as color
biplot_base +
  geom_point(data = bc_pca_data,
             aes(x = PC1, y = PC2, 
                 color = Diagnosis, 
                 size = abs(PC3)),  # abs() helps visualize both high/low PC3
             alpha = 0.7) +
  labs(title = "Biplot of Breast Cancer Cells (PC1 vs PC2, Size = PC3)",
       size = "|PC3| (magnitude)",
       color = "Diagnosis") +
  theme_minimal()