From f7e2f886f6ebdedf1b1a6effe4414943680749bd Mon Sep 17 00:00:00 2001 From: changk2 Date: Tue, 10 Sep 2024 21:46:39 -0400 Subject: [PATCH 1/2] assignment2 PIXL dataset --- .../Assignment02/changk2-assignment2-f24.Rmd | 524 ++++++ .../Assignment02/changk2-assignment2-f24.html | 1511 +++++++++++++++++ .../Assignment02/changk2-assignment2-f24.pdf | Bin 0 -> 136941 bytes 3 files changed, 2035 insertions(+) create mode 100644 StudentNotebooks/Assignment02/changk2-assignment2-f24.Rmd create mode 100644 StudentNotebooks/Assignment02/changk2-assignment2-f24.html create mode 100644 StudentNotebooks/Assignment02/changk2-assignment2-f24.pdf diff --git a/StudentNotebooks/Assignment02/changk2-assignment2-f24.Rmd b/StudentNotebooks/Assignment02/changk2-assignment2-f24.Rmd new file mode 100644 index 0000000..c69cbdb --- /dev/null +++ b/StudentNotebooks/Assignment02/changk2-assignment2-f24.Rmd @@ -0,0 +1,524 @@ +--- +title: "Mars 2020 Mission Data Notebook:" +subtitle: "DAR Assignment 2 (Fall 2024)" +author: "Your Name Here" +date: "`r format(Sys.time(), '%d %B %Y')`" +output: + html_document: + toc: true + number_sections: true + df_print: paged + pdf_document: + latex_engine: xelatex +--- +```{r setup, include=FALSE} + +# Required R package installation; RUN THIS BLOCK BEFORE ATTEMPTING TO KNIT THIS NOTEBOOK!!! +# This section install packages if they are not already installed. +# This block will not be shown in the knit file. +knitr::opts_chunk$set(echo = TRUE) + +# Set the default CRAN repository +local({r <- getOption("repos") + r["CRAN"] <- "http://cran.r-project.org" + options(repos=r) +}) + +if (!require("pandoc")) { + install.packages("pandoc") + library(pandoc) +} + +# Required packages for M20 LIBS analysis +if (!require("rmarkdown")) { + install.packages("rmarkdown") + library(rmarkdown) +} +if (!require("tidyverse")) { + install.packages("tidyverse") + library(tidyverse) +} +if (!require("stringr")) { + install.packages("stringr") + library(stringr) +} + +if (!require("ggbiplot")) { + install.packages("ggbiplot") + library(ggbiplot) +} + +if (!require("pheatmap")) { + install.packages("pheatmap") + library(pheatmap) +} + +``` + +# DAR ASSIGNMENT 2 (Introduction): Introductory DAR Notebook + +This notebook is broken into two main parts: + +* **Part 1:** Preparing your local repo for **DAR Assignment 2** +* **Part 2:** Loading and some analysis of the Mars 2020 (M20) Datasets + * Lithology: _Summarizes the mineral characteristics of samples collected at certain sample locations._ + * PIXL: Planetary Instrument for X-ray Lithochemistry. _Measures elemental chemistry of samples at sub-millimeter scales of samples._ + * SHERLOC: Scanning Habitable Environments with Raman and Luminescence for Organics and Chemicals. _Uses cameras, a spectrometer, and a laser of samples to search for organic compounds and minerals that have been altered in watery environments and may be signs of past microbial life._ + * LIBS: Laser-induced breakdown spectroscopy. _Uses a laser beam to help identify minerals in samples and other areas that are beyond the reach of the rover's robotic arm or in areas too steep for the rover to travel._ + +* **Part 3:** Individual analysis of your team's dataset + +* **Part 4:** Preparation of Team Presentation + + +**NOTE:** The RPI github repository for all the code and data required for this notebook may be found at: + +* https://github.rpi.edu/DataINCITE/DAR-Mars-F24 + + +# DAR ASSIGNMENT 2 (Part 1): Preparing your local repo for Assignment 2 + +In this assignment you'll start by making a copy of the Assignment 2 template notebook, then you'll add to your copy with your original work. The instructions which follow explain how to accomplish this. + +**NOTE:** You already cloned the `DAR-Mars-F24` repository for Assignment 1; you **do not** need to make another clone of the repo, but you must begin by updating your copy as instructed below: + +## Updating your local clone of the `DAR-Mars-F24` repository + +* Access RStudio Server on the IDEA Cluster at http://lp01.idea.rpi.edu/rstudio-ose/ + * REMINDER: You must be on the RPI VPN!! +* Access the Linux shell on the IDEA Cluster by clicking the **Terminal** tab of RStudio Server (lower left panel). + * You now see the Linux shell on the IDEA Cluster + * `cd` (change directory) to enter your home directory using: `cd ~` + * Type `pwd` to confirm where you are +* In the Linux shell, `cd` to `DAR-Mars-F24` + * Type `git pull origin main` to pull any updates + * Always do this when you being work; we might have added or changed something! +* In the Linux shell, `cd` into `Assignment02` + * Type `ls -al` to list the current contents + * Don't be surprised if you see many files! +* In the Linux shell, type `git branch` to verify your current working branch + * If it is not `dar-yourrcs`, type `git checkout dar-yourrcs` (where `yourrcs` is your RCS id) + * Re-type `git branch` to confirm +* Now in the RStudio Server UI, navigate to the `DAR-Mars-F24/StudentNotebooks/Assignment02` directory via the **Files** panel (lower right panel) + * Under the **More** menu, set this to be your R working directory + * Setting the correct working directory is essential for interactive R use! + +You're now ready to start coding Assignment 2! + +## Creating your copy of the Assignment 2 notebook + +1. In RStudio, make a **copy** of `dar-f24-assignment2-template.Rmd` file using a *new, original, descriptive* filename that **includes your RCS ID!** + * Open `dar-f24-assignment2-template.Rmd` + * **Save As...** using a new filename that includes your RCS ID + * Example filename for user `erickj4`: `erickj4-assignment2-f24.Rmd` + * POINTS OFF IF: + * You don't create a new filename! + * You don't include your RCS ID! + * You include `template` in your new filename! +2. Edit your new notebook using RStudio and save + * Change the `title:` and `subtitle:` headers (at the top of the file) + * Change the `author:` + * Don't bother changing the `date:`; it should update automagically... + * **Save** your changes +3. Use the RStudio `Knit` command to create an PDF file; repeat as necessary + * Use the down arrow next to the word `Knit` and select **Knit to PDF** + * You may also knit to HTML... +4. In the Linux terminal, use `git add` to add each new file you want to add to the repository + * Type: `git add yourfilename.Rmd` + * Type: `git add yourfilename.pdf` (created when you knitted) + * Add your HTML if you also created one... +5. When you're ready, in Linux commit your changes: + * Type: `git commit -m "some comment"` where "some comment" is a useful comment describing your changes + * This commits your changes to your local repo, and sets the stage for your next operation. +6. Finally, push your commits to the RPI github repo + * Type: `git push origin dar-yourrcs` (where `dar-yourrcs` is the branch you've been working in) + * Your changes are now safely on the RPI github. +7. **REQUIRED:** On the RPI github, **submit a pull request.** + * In a web browser, navigate to https://github.rpi.edu/DataINCITE/DAR-Mars-F24 + * In the branch selector drop-down (by default says **master**), select your branch + * **Submit a pull request for your branch** + * One of the DAR instructors will merge your branch, and your new files will be added to the master branch of the repo. _Do not merge your branch yourself!_ + +# DAR ASSIGNMENT 2 (Part 2): Loading the Mars 2020 (M20) Datasets + +In this assignment there are four datasets from separate instruments on the Mars Perserverance rover available for analysis: + +* **Lithology:** Summarizes the mineral characteristics of samples collected at certain sample locations +* **PIXL:** Planetary Instrument for X-ray Lithochemistry of collected samples +* **SHERLOC:** Scanning Habitable Environments with Raman and Luminescence for Organics and Chemicals for collected samples +* **LIBS:** Laser-induced breakdown spectroscopy which are measured in many areas (not just samples) + +Each dataset provides data about the mineralogy of the surface of Mars. Based on the purpose and nature of the instrument, the data is collected at different intervals along the path of Perseverance as it makes it way across the Jezero crater. Some of the data (esp. LIBS) is collected almost every Martian day, or _sol_. Some of the data (PIXL and SHERLOC) is only collected at certain sample locations of interest + +Your objective is to perform an analysis of the your team's assigned dataset in order to learn all you can about these Mars samples. + +NOTES: + + * All of these datasets can be found in `/academics/MATP-4910-F24/DAR-Mars-F24/Data` + * We have included a comprehensive `samples.Rds` dataset that includes useful details about the sample locations, including Martian latitude and longitude and the sol that individual samples were collected. + * Also included is `rover.waypoints.Rds` that provides detailed location information (lat/lon) for the Perseverance rover throughout its journey, up to the present. This can be updated when necessary using the included `roverStatus-f24.R` script. + * A general guide to the available Mars 2020 data is available here: https://pds-geosciences.wustl.edu/missions/mars2020/index.htm + * Other useful MARS 2020 sites + https://science.nasa.gov/mission/mars-2020-perseverance/mars-rock-samples/ and https://an.rsl.wustl.edu/m20/AN/an3.aspx?AspxAutoDetectCookieSupport=1 + * Note that PIXL, SHERLOC, and Lithology describe 16 sample that were physically collected. There will eventually be 38 samples. These datasets can be merged by sample. The LIBS data includes observations collected at many more locations so how to combine the LIBS data with the other datasets is an open research question. + +## Data Set A: Load the Lithology Data + +The first five features of the dataset describe twenty-four (24) rover sample locations. + +The remaining features provides a simple binary (`1` or `0`) summary of presence or absence of 35 minerals at the 24 rover sample locations. + +Only the first sixteen (16) samples are maintained, as the remaining are missing the mineral descriptors. + +The following code "cleans" the dataset to prepare for analysis. It first creates a dataframe with metadata and measurements for samples, and then creates a matrix containing only numeric measurements for later analysis. + +```{r} +# Load the saved lithology data with locations added +lithology.df<- readRDS("/academics/MATP-4910-F24/DAR-Mars-F24/Data/mineral_data_static.Rds") + +# Cast samples as numbers +lithology.df$sample <- as.numeric(lithology.df$sample) + +# Convert rest into factors +lithology.df[sapply(lithology.df, is.character)] <- + lapply(lithology.df[sapply(lithology.df, is.character)], + as.factor) + +# Keep only first 16 samples because the data for the rest of the samples is not available yet +lithology.df<-lithology.df[1:16,] + +# Look at summary of cleaned data frame +summary(lithology.df) + +# Create a matrix containing only the numeric measurements. The remaining features are metadata about the sample. +lithology.matrix <- sapply(lithology.df[,6:40],as.numeric)-1 + +# Review the structure of our matrix +str(lithology.matrix) +``` + + +## Data Set B: Load the PIXL Data + +The PIXL data provides summaries of the mineral compositions measured at selected sample sites by the PIXL instrument. Note that here we scale pixl.mat so features have mean 0 and standard deviation so results will be different than in Assignment 1. + +```{r} +# Load the saved PIXL data with locations added +pixl.df <- readRDS("/academics/MATP-4910-F24/DAR-Mars-F24/Data/samples_pixl_wide.Rds") + +# Convert to factors +pixl.df[sapply(pixl.df, is.character)] <- lapply(pixl.df[sapply(pixl.df, is.character)], + as.factor) + +# Review our dataframe +summary(pixl.df) + +# Make the matrix of just mineral percentage measurements +pixl.matrix <- pixl.df[,2:14] %>% scale() + +# Review the structure +str(pixl.matrix) + +wssplot <- function(data, nc=15, seed=10){ + wss <- data.frame(cluster=1:nc, quality=c(0)) + for (i in 1:nc){ + set.seed(seed) + wss[i,2] <- kmeans(data, centers=i)$tot.withinss + } + ggplot(data=wss,aes(x=cluster,y=quality)) + + geom_line() + + ggtitle("Quality of k-means by Cluster") +} + +# Apply `wssplot()` to our PIXL data +wssplot(pixl.matrix, nc=8, seed=2) +``` +Smaller quality values: After scaling, the quality values (or WSS values) are significantly lower, starting at around 200. This indicates that the features have been normalized, ensuring that all features contribute equally to the clustering process. This prevents high-value features from dominating the distance calculations and ensures a more balanced approach. + +Smoother WSS curve: The reduction in quality values is much more smooth, indicating that the features have a more balanced influence on the clustering. Each feature contributes equally after scaling, leading to more consistent and reasonable clustering results. + +```{r} +set.seed(2) +k <- 5 +km <- kmeans(pixl.matrix,k) + + +pheatmap(km$centers,scale="none") + +# cluster result +print(km$cluster) +print(km$centers) +print(km$tot.withinss) +``` +More balanced color distribution: After scaling, all features are normalized to a similar range. This results in a more balanced contribution from each feature to the clustering process, as reflected by the more uniform color distribution. Now, features such as K2O also show out notable color differences, indicating they play a more significant role in clustering after scaling. + +More reasonable clustering results: By standardizing the features to the same scale, the clustering results are no longer dominated by high-value features. Each feature contributes more equally to the cluster centers, leading to smoother transitions in the feature values and a more reliable clustering outcome. + +```{r} +pca_result <- prcomp(pixl.matrix, scale=TRUE) +pca_data <- data.frame(pca_result$x[, 1:2], cluster=km$cluster) + +# visualize +ggplot(pca_data, aes(x=PC1, y=PC2, color=factor(cluster))) + + geom_point(size=4) + + ggtitle("K-means Clustering Results (PCA Reduced Data)") + + theme_minimal() + +# Perform the PCA on the matrix `pixl_trim.mat` we created earlier + +pixl.matrix.pca <- prcomp(pixl.matrix, scale=FALSE) + +# generate the Scree plot +ggscreeplot(pixl.matrix.pca) +``` + +```{r} +# clusters sizes are in the km object produced by kmeans +cluster.df<-data.frame(cluster= 1:5, size=km$size) + +ggbiplot::ggbiplot(pixl.matrix.pca, + labels = pixl.df$type, + groups = as.factor(km$cluster)) + + xlim(-2,2) + ylim(-2,2) +``` +Variable Direction and Distribution: The variables (e.g., SiO2, FeO-T, Mno, etc.) are spread out in a balanced radial pattern. The arrows representing the variables have relatively equal lengths, indicating that each feature has a balanced influence on the results. Since the data has been scaled, each variable contributes similarly in the PCA calculation, preventing certain features from dominating the clustering due to their value range. + + +## Data Set C: Load the LIBS Data + +The LIBS data provides summaries of the mineral compositions measured at selected sample sites by the LIBS instrument, part of the Perseverance SuperCam. + +```{r} + +# Load the saved LIBS data with locations added +libs.df <- readRDS("/academics/MATP-4910-F24/DAR-Mars-F24/Data/supercam_libs_moc_loc.Rds") + +#Drop features that are not to be used in the analysis for this notebook +libs.df <- libs.df %>% + select(!(c(distance_mm,Tot.Em.,SiO2_stdev,TiO2_stdev,Al2O3_stdev,FeOT_stdev, + MgO_stdev,Na2O_stdev,CaO_stdev,K2O_stdev,Total))) + +# Convert the points to numeric +libs.df$point <- as.numeric(libs.df$point) + +# Review what we have +summary(libs.df) + +# Make the a matrix contain only the libs measurements for each mineral +libs.matrix <- as.matrix(libs.df[,6:13]) + +# Check to see scaling +str(libs.matrix) +``` + + + +## Dataset D: Load the SHERLOC Data + +The SHERLOC data you will be using for this lab is the result of scientists' interpretations of extensive spectral analysis of abrasion samples provided by the SHERLOC instrument. + +**NOTE:** This dataset presents minerals as rows and sample sites as columns. You'll probably want to rotate the dataset for easier analysis.... + +```{r} + +# Read in data as provided. +sherloc_abrasion_raw <- readRDS("/academics/MATP-4910-F24/DAR-Mars-F24/Data/abrasions_sherloc_samples.Rds") + +# Clean up data types +sherloc_abrasion_raw$Mineral<-as.factor(sherloc_abrasion_raw$Mineral) +sherloc_abrasion_raw[sapply(sherloc_abrasion_raw, is.character)] <- lapply(sherloc_abrasion_raw[sapply(sherloc_abrasion_raw, is.character)], + as.numeric) +# Transform NA's to 0 +sherloc_abrasion_raw <- sherloc_abrasion_raw %>% replace(is.na(.), 0) + +# Reformat data so that rows are "abrasions" and columns list the presence of minerals. +# Do this by "pivoting" to a long format, and then back to the desired wide format. + +sherloc_long <- sherloc_abrasion_raw %>% + pivot_longer(!Mineral, names_to = "Name", values_to = "Presence") + +# Make abrasion a factor +sherloc_long$Name <- as.factor(sherloc_long$Name) + +# Make it a matrix +sherloc.matrix <- sherloc_long %>% + pivot_wider(names_from = Mineral, values_from = Presence) + +# Get sample information from PIXL and add to measurements -- assumes order is the same + +sherloc.df <- cbind(pixl.df[,c("sample","type","campaign","abrasion")],sherloc.matrix) + +# Review what we have +summary(sherloc.df) + +# Measurements are everything except first column +sherloc.matrix<-as.matrix(sherloc.matrix[,-1]) + +# Sherlock measurement matrix +# Review the structure +str(sherloc.matrix) +``` +## Data Set E: PIXL + Sherloc +```{r} +# Combine PIXL and SHERLOC dataframes +pixl_sherloc.df <- cbind(pixl.df,sherloc.df ) + +# Review what we have +summary(pixl_sherloc.df) + +# Combine PIXL and SHERLOC matrices +pixl_sherloc.matrix<-cbind(pixl.matrix,sherloc.matrix) + +# Review the structure of our matrix +str(pixl_sherloc.matrix) + +``` + + +## Data Set F: PIXL + Lithography + +Create data and matrix from prior datasets + +```{r} +# Combine our PIXL and Lithology dataframes +pixl_lithology.df <- cbind(pixl.df,lithology.df ) + +# Review what we have +summary(pixl_lithology.df) + +# Combine PIXL and Lithology matrices +pixl_lithology.matrix<-cbind(pixl.matrix,lithology.matrix) + +# Review the structure +str(pixl_lithology.matrix) + +``` + +## Data Set G: Sherloc + Lithology + +Create Data and matrix from prior datasets by taking on appropriate combinations. + +```{r} +# Combine the Lithology and SHERLOC dataframes +sherloc_lithology.df <- cbind(sherloc.df,lithology.df ) + +# Review what we have +summary(sherloc_lithology.df) + +# Combine the Lithology and SHERLOC matrices +sherloc_lithology.matrix<-cbind(sherloc.matrix,lithology.matrix) + +# Review the resulting matrix +str(sherloc_lithology.matrix) + +``` +## Data Set H: Sherloc + Lithology + PIXL + +Create data frame and matrix from prior datasets by making on appropriate combinations. + +```{r} +# Combine the Lithology and SHERLOC dataframes +sherloc_lithology_pixl.df <- cbind(sherloc.df,lithology.df, pixl.df ) + +# Review what we have +summary(sherloc_lithology_pixl.df) + +# Combine the Lithology, SHERLOC and PIXLmatrices +sherloc_lithology_pixl.matrix<-cbind(sherloc.matrix,lithology.matrix,pixl.matrix) + +# Review the resulting matrix +str(sherloc_lithology_pixl.matrix) + +``` + +# Analysis of Data (Part 3) + +Each team has been assigned one of six datasets: + +1. Dataset B: PIXL: The PIXL team's goal is to understand and explain how scaling changes results from Assignment 1. The matrix version was scaled above but not in Assignment 1. + +2. Dataset C: LIBS (with appropriate scaling as necessary. Not scaled yet.) + +3. Dataset D: Sherloc (with appropriate scaling as necessary. Not scaled yet.) + +4. Dataset E: PIXL + Sherloc (with appropriate scaling as necessary. Not scaled yet.) + +5. Dataset F: PIXL + Lithography (with appropriate scaling as necessary. Not scaled yet.) + +6. Dataset G: Sherloc + Lithograpy (with appropriate scaling as necessary. Not scaled yet.) + +7. Dataset H: PIXL + Sherloc + Lithograpy (with appropriate scaling as necessary. Not scaled yet.) + +**For the data set assigned to your team, perform the following steps.** Feel free to use the methods/code from Assignment 1 as desired. Communicate with your teammates. Make sure that you are doing different variations of below analysis so that no team member does the exact same analysis. If you want to use the same clustering for your team (which is okay but then vary rest), make sure you use the same random seeds. + +1. _Describe the data set contained in the data frame and matrix:_ How many rows does it have and how many features? Which features are measurements and which features are metadata about the samples? (3 pts) + +2. _Scale this data appropriately (you can choose the scaling method or decide to not scale data):_ Explain why you chose a scaling method or to not scale. (3 pts) + +3. _Cluster the data using k-means or your favorite clustering method (like hierarchical clustering):_ Describe how you picked the best number of clusters. Indicate the number of points in each clusters. Coordinate with your team so you try different approaches. If you want to share results with your team mates, make sure to use the same random seeds. (6 pts) + +4. _Perform a **creative analysis** that provides insights into what one or more of the clusters are and what they tell you about the MARS data: Alternatively do another creative analysis of your datasets that leads to one of more findings. Make sure to explain what your analysis and discuss your the results. + + +# Preparation of Team Presentation (Part 4) + +Prepare a presentation of your teams result to present in class on **September 11** starting at 9am in AE217 (20 pts) +The presentation should include the following elements + +0.Your teams names and members +1. A **Description** of the data set that you analyzed including how many observations and how many features. (<= 1.5 mins) +2. Each team member gets **three minutes** to explain their analysis: + * what analysis they performed + * the results of that analysis + * a brief discussion of their interpretation of these results + * <= 18 mins _total!_ +3. A **Conclusion** slide indicating major findings of the teams (<= 1.5 mins) +4. Thoughts on **potential next steps** for the MARS team (<= 1.5 mins) + +* A template for your team presentation is included here: https://bit.ly/dar-template-f24 + +* The rubric for the presentation is here: + +https://docs.google.com/document/d/1-4o1O4h2r8aMjAplmE-ItblQnyDAKZwNs5XCnmwacjs/pub + + +* Post a link to your teams presentation in the MARS webex chat before class. You can continue to edit until the last minute. + + + + +# When you're done: SAVE, COMMIT and PUSH YOUR CHANGES! + +When you are satisfied with your edits and your notebook knits successfully, remember to push your changes to the repo using the following steps: + +* `git branch` + * To double-check that you are in your working branch +* `git add ` +* `git commit -m "Some useful comments"` +* `git push origin ` +* do a pull request + + + + + +# APPENDIX: Accessing RStudio Server on the IDEA Cluster + +The IDEA Cluster provides seven compute nodes (4x 48 cores, 3x 80 cores, 1x storage server) + +* The Cluster requires RCS credentials, enabled via registration in class + * email John Erickson for problems `erickj4@rpi.edu` +* RStudio, Jupyter, MATLAB, GPUs (on two nodes); lots of storage and computes +* Access via RPI physical network or VPN only + +# More info about Rstudio on our Cluster + +## RStudio GUI Access: + +* Use: + * http://lp01.idea.rpi.edu/rstudio-ose/ + * http://lp01.idea.rpi.edu/rstudio-ose-3/ + * http://lp01.idea.rpi.edu/rstudio-ose-6/ + * http://lp01.idea.rpi.edu/rstudio-ose-7/ +* Linux terminal accessible from within RStudio "Terminal" or via ssh (below) + diff --git a/StudentNotebooks/Assignment02/changk2-assignment2-f24.html b/StudentNotebooks/Assignment02/changk2-assignment2-f24.html new file mode 100644 index 0000000..c565428 --- /dev/null +++ b/StudentNotebooks/Assignment02/changk2-assignment2-f24.html @@ -0,0 +1,1511 @@ + + + + + + + + + + + + + + + +Mars 2020 Mission Data Notebook: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+

1 DAR ASSIGNMENT 2 (Introduction): Introductory DAR Notebook

+

This notebook is broken into two main parts:

+
    +
  • Part 1: Preparing your local repo for DAR Assignment 2

  • +
  • Part 2: Loading and some analysis of the Mars 2020 (M20) Datasets

    +
      +
    • Lithology: Summarizes the mineral characteristics of samples collected at certain sample locations.
    • +
    • PIXL: Planetary Instrument for X-ray Lithochemistry. Measures elemental chemistry of samples at sub-millimeter scales of samples.
    • +
    • SHERLOC: Scanning Habitable Environments with Raman and Luminescence for Organics and Chemicals. Uses cameras, a spectrometer, and a laser of samples to search for organic compounds and minerals that have been altered in watery environments and may be signs of past microbial life.
    • +
    • LIBS: Laser-induced breakdown spectroscopy. Uses a laser beam to help identify minerals in samples and other areas that are beyond the reach of the rover’s robotic arm or in areas too steep for the rover to travel.
    • +
  • +
  • Part 3: Individual analysis of your team’s dataset

  • +
  • Part 4: Preparation of Team Presentation

  • +
+

NOTE: The RPI github repository for all the code and data required for this notebook may be found at:

+ +
+
+

2 DAR ASSIGNMENT 2 (Part 1): Preparing your local repo for Assignment 2

+

In this assignment you’ll start by making a copy of the Assignment 2 template notebook, then you’ll add to your copy with your original work. The instructions which follow explain how to accomplish this.

+

NOTE: You already cloned the DAR-Mars-F24 repository for Assignment 1; you do not need to make another clone of the repo, but you must begin by updating your copy as instructed below:

+
+

2.1 Updating your local clone of the DAR-Mars-F24 repository

+
    +
  • Access RStudio Server on the IDEA Cluster at http://lp01.idea.rpi.edu/rstudio-ose/ +
      +
    • REMINDER: You must be on the RPI VPN!!
    • +
  • +
  • Access the Linux shell on the IDEA Cluster by clicking the Terminal tab of RStudio Server (lower left panel). +
      +
    • You now see the Linux shell on the IDEA Cluster
    • +
    • cd (change directory) to enter your home directory using: cd ~
    • +
    • Type pwd to confirm where you are
    • +
  • +
  • In the Linux shell, cd to DAR-Mars-F24 +
      +
    • Type git pull origin main to pull any updates
    • +
    • Always do this when you being work; we might have added or changed something!
    • +
  • +
  • In the Linux shell, cd into Assignment02 +
      +
    • Type ls -al to list the current contents
    • +
    • Don’t be surprised if you see many files!
    • +
  • +
  • In the Linux shell, type git branch to verify your current working branch +
      +
    • If it is not dar-yourrcs, type git checkout dar-yourrcs (where yourrcs is your RCS id)
    • +
    • Re-type git branch to confirm
    • +
  • +
  • Now in the RStudio Server UI, navigate to the DAR-Mars-F24/StudentNotebooks/Assignment02 directory via the Files panel (lower right panel) +
      +
    • Under the More menu, set this to be your R working directory
    • +
    • Setting the correct working directory is essential for interactive R use!
    • +
  • +
+

You’re now ready to start coding Assignment 2!

+
+
+

2.2 Creating your copy of the Assignment 2 notebook

+
    +
  1. In RStudio, make a copy of dar-f24-assignment2-template.Rmd file using a new, original, descriptive filename that includes your RCS ID! +
      +
    • Open dar-f24-assignment2-template.Rmd
    • +
    • Save As… using a new filename that includes your RCS ID
    • +
    • Example filename for user erickj4: erickj4-assignment2-f24.Rmd
    • +
    • POINTS OFF IF: +
        +
      • You don’t create a new filename!
      • +
      • You don’t include your RCS ID!
      • +
      • You include template in your new filename!
      • +
    • +
  2. +
  3. Edit your new notebook using RStudio and save +
      +
    • Change the title: and subtitle: headers (at the top of the file)
    • +
    • Change the author:
    • +
    • Don’t bother changing the date:; it should update automagically…
    • +
    • Save your changes
    • +
  4. +
  5. Use the RStudio Knit command to create an PDF file; repeat as necessary +
      +
    • Use the down arrow next to the word Knit and select Knit to PDF
    • +
    • You may also knit to HTML…
    • +
  6. +
  7. In the Linux terminal, use git add to add each new file you want to add to the repository +
      +
    • Type: git add yourfilename.Rmd
    • +
    • Type: git add yourfilename.pdf (created when you knitted)
    • +
    • Add your HTML if you also created one…
    • +
  8. +
  9. When you’re ready, in Linux commit your changes: +
      +
    • Type: git commit -m "some comment" where “some comment” is a useful comment describing your changes
    • +
    • This commits your changes to your local repo, and sets the stage for your next operation.
    • +
  10. +
  11. Finally, push your commits to the RPI github repo +
      +
    • Type: git push origin dar-yourrcs (where dar-yourrcs is the branch you’ve been working in)
    • +
    • Your changes are now safely on the RPI github.
    • +
  12. +
  13. REQUIRED: On the RPI github, submit a pull request. +
      +
    • In a web browser, navigate to https://github.rpi.edu/DataINCITE/DAR-Mars-F24
    • +
    • In the branch selector drop-down (by default says master), select your branch
    • +
    • Submit a pull request for your branch
    • +
    • One of the DAR instructors will merge your branch, and your new files will be added to the master branch of the repo. Do not merge your branch yourself!
    • +
  14. +
+
+
+
+

3 DAR ASSIGNMENT 2 (Part 2): Loading the Mars 2020 (M20) Datasets

+

In this assignment there are four datasets from separate instruments on the Mars Perserverance rover available for analysis:

+
    +
  • Lithology: Summarizes the mineral characteristics of samples collected at certain sample locations
  • +
  • PIXL: Planetary Instrument for X-ray Lithochemistry of collected samples
  • +
  • SHERLOC: Scanning Habitable Environments with Raman and Luminescence for Organics and Chemicals for collected samples
  • +
  • LIBS: Laser-induced breakdown spectroscopy which are measured in many areas (not just samples)
  • +
+

Each dataset provides data about the mineralogy of the surface of Mars. Based on the purpose and nature of the instrument, the data is collected at different intervals along the path of Perseverance as it makes it way across the Jezero crater. Some of the data (esp. LIBS) is collected almost every Martian day, or sol. Some of the data (PIXL and SHERLOC) is only collected at certain sample locations of interest

+

Your objective is to perform an analysis of the your team’s assigned dataset in order to learn all you can about these Mars samples.

+

NOTES:

+
    +
  • All of these datasets can be found in /academics/MATP-4910-F24/DAR-Mars-F24/Data
  • +
  • We have included a comprehensive samples.Rds dataset that includes useful details about the sample locations, including Martian latitude and longitude and the sol that individual samples were collected.
  • +
  • Also included is rover.waypoints.Rds that provides detailed location information (lat/lon) for the Perseverance rover throughout its journey, up to the present. This can be updated when necessary using the included roverStatus-f24.R script.
  • +
  • A general guide to the available Mars 2020 data is available here: https://pds-geosciences.wustl.edu/missions/mars2020/index.htm
  • +
  • Other useful MARS 2020 sites https://science.nasa.gov/mission/mars-2020-perseverance/mars-rock-samples/ and https://an.rsl.wustl.edu/m20/AN/an3.aspx?AspxAutoDetectCookieSupport=1
  • +
  • Note that PIXL, SHERLOC, and Lithology describe 16 sample that were physically collected. There will eventually be 38 samples. These datasets can be merged by sample. The LIBS data includes observations collected at many more locations so how to combine the LIBS data with the other datasets is an open research question.
  • +
+
+

3.1 Data Set A: Load the Lithology Data

+

The first five features of the dataset describe twenty-four (24) rover sample locations.

+

The remaining features provides a simple binary (1 or 0) summary of presence or absence of 35 minerals at the 24 rover sample locations.

+

Only the first sixteen (16) samples are maintained, as the remaining are missing the mineral descriptors.

+

The following code “cleans” the dataset to prepare for analysis. It first creates a dataframe with metadata and measurements for samples, and then creates a matrix containing only numeric measurements for later analysis.

+
# Load the saved lithology data with locations added
+lithology.df<- readRDS("/academics/MATP-4910-F24/DAR-Mars-F24/Data/mineral_data_static.Rds")
+
+# Cast samples as numbers
+lithology.df$sample <- as.numeric(lithology.df$sample)
+
+# Convert rest into factors
+lithology.df[sapply(lithology.df, is.character)] <-
+  lapply(lithology.df[sapply(lithology.df, is.character)], 
+                                       as.factor)
+
+# Keep only first 16 samples because the data for the rest of the samples is not available yet
+lithology.df<-lithology.df[1:16,]
+
+# Look at summary of cleaned data frame
+summary(lithology.df)
+
##      sample              name          SampleType         campaign
+##  Min.   : 1.00   Atsah     : 1   atmospheric: 1   Crater Floor:9  
+##  1st Qu.: 4.75   Bearwallow: 1   regolith   : 0   Delta Front :7  
+##  Median : 8.50   Coulettes : 1   rock core  :15   Margin Unit :0  
+##  Mean   : 8.50   Hahonih   : 1                                    
+##  3rd Qu.:12.25   Hazeltop  : 1                                    
+##  Max.   :16.00   Kukaklek  : 1                                    
+##                  (Other)   :10                                    
+##          abrasion feldspar plagioclase pyroxene olivine quartz apatite
+##  Alfalfa     :2   0:14     0:13        0: 5     0: 6    0:14   0:13   
+##  Bellegarde  :2   1: 2     1: 3        1:11     1:10    1: 2   1: 3   
+##  Berry Hollow:2                                                       
+##  Dourbes     :2                                                       
+##  Novarupta   :2                                                       
+##  Quartier    :2                                                       
+##  (Other)     :4                                                       
+##  FeTi_Oxides Iron_Oxide Sulfate Perchlorates Phosphate Ca_Sulfate Carbonate
+##  0:13        0:9        0: 4    0:15         0:11      0:10       0: 1     
+##  1: 3        1:7        1:12    1: 1         1: 5      1: 6       1:15     
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##  Fe_Mg_clay Fe_Mg_carbonate Mg_sulfate Phyllosilicates Chlorite Halite
+##  0:13       0:14            0:13       0:12            0:14     0:13  
+##  1: 3       1: 2            1: 3       1: 4            1: 2     1: 3  
+##                                                                       
+##                                                                       
+##                                                                       
+##                                                                       
+##                                                                       
+##  Organic_matter Hydrated_Ca_Sulfate Hydrated_Sulfates Hydrated_Mg_Fe_Sulfate
+##  0: 5           0:14                0:14              0:13                  
+##  1:11           1: 2                1: 2              1: 3                  
+##                                                                             
+##                                                                             
+##                                                                             
+##                                                                             
+##                                                                             
+##  Na_Perchlorate Amorphous_Silicate Hydrated_Carbonates Disordered_Silicates
+##  0:15           0:9                0:16                0:14                
+##  1: 1           1:7                                    1: 2                
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##  Hydrated_Iron_Oxide Sulfate+Organic_Matter Other_hydrated_phases Kaolinite
+##  0:15                0:11                   0:8                   0:13     
+##  1: 1                1: 5                   1:8                   1: 3     
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##  Chromite Ilmenite Zircon/Baddeleyite Spinels
+##  0:14     0:14     0:14               0:14   
+##  1: 2     1: 2     1: 2               1: 2   
+##                                              
+##                                              
+##                                              
+##                                              
+## 
+
# Create a matrix containing only the numeric measurements.  The remaining features are metadata about the sample. 
+lithology.matrix <- sapply(lithology.df[,6:40],as.numeric)-1            
+
+# Review the structure of our matrix
+str(lithology.matrix)
+
##  num [1:16, 1:35] 0 0 0 0 0 0 0 1 1 0 ...
+##  - attr(*, "dimnames")=List of 2
+##   ..$ : NULL
+##   ..$ : chr [1:35] "feldspar" "plagioclase" "pyroxene" "olivine" ...
+
+
+

3.2 Data Set B: Load the PIXL Data

+

The PIXL data provides summaries of the mineral compositions measured at selected sample sites by the PIXL instrument. Note that here we scale pixl.mat so features have mean 0 and standard deviation so results will be different than in Assignment 1.

+
# Load the saved PIXL data with locations added
+pixl.df <- readRDS("/academics/MATP-4910-F24/DAR-Mars-F24/Data/samples_pixl_wide.Rds")
+
+# Convert to factors
+pixl.df[sapply(pixl.df, is.character)] <- lapply(pixl.df[sapply(pixl.df, is.character)], 
+                                       as.factor)
+
+# Review our dataframe
+summary(pixl.df)
+
##      sample           Na20            Mgo             Al203       
+##  Min.   : 1.00   Min.   :1.000   Min.   : 0.730   Min.   : 1.700  
+##  1st Qu.: 4.75   1st Qu.:1.853   1st Qu.: 2.533   1st Qu.: 2.220  
+##  Median : 8.50   Median :1.900   Median :12.800   Median : 3.710  
+##  Mean   : 8.50   Mean   :2.672   Mean   :11.682   Mean   : 5.072  
+##  3rd Qu.:12.25   3rd Qu.:4.500   3rd Qu.:19.100   3rd Qu.: 7.117  
+##  Max.   :16.00   Max.   :5.550   Max.   :22.700   Max.   :11.600  
+##                                                                   
+##       Si02            P205             S03               Cl       
+##  Min.   :22.60   Min.   :0.1000   Min.   : 0.780   Min.   :0.400  
+##  1st Qu.:31.22   1st Qu.:0.2350   1st Qu.: 1.495   1st Qu.:0.940  
+##  Median :38.85   Median :0.5250   Median : 2.600   Median :1.740  
+##  Mean   :38.55   Mean   :0.6512   Mean   : 5.562   Mean   :1.846  
+##  3rd Qu.:41.17   3rd Qu.:0.8400   3rd Qu.: 3.800   3rd Qu.:2.080  
+##  Max.   :57.10   Max.   :2.7600   Max.   :21.530   Max.   :4.500  
+##                                                                   
+##       K20              Cao             Ti02            Cr203      
+##  Min.   :0.0000   Min.   :1.500   Min.   :0.2000   Min.   :0.000  
+##  1st Qu.:0.1600   1st Qu.:2.655   1st Qu.:0.5900   1st Qu.:0.025  
+##  Median :0.2000   Median :3.120   Median :0.7000   Median :0.155  
+##  Mean   :0.5800   Mean   :3.688   Mean   :0.8194   Mean   :0.355  
+##  3rd Qu.:0.8275   3rd Qu.:4.310   3rd Qu.:0.9900   3rd Qu.:0.290  
+##  Max.   :1.9000   Max.   :7.770   Max.   :2.4900   Max.   :1.900  
+##                                                                   
+##       Mno             FeO-T               name             type  
+##  Min.   :0.1000   Min.   :13.24   Atsah     : 1   Igneous    :8  
+##  1st Qu.:0.2800   1st Qu.:16.71   Bearwallow: 1   N/A        :1  
+##  Median :0.4000   Median :23.86   Coulettes : 1   Sedimentary:7  
+##  Mean   :0.3812   Mean   :21.45   Hahonih   : 1                  
+##  3rd Qu.:0.4900   3rd Qu.:25.70   Hazeltop  : 1                  
+##  Max.   :0.6900   Max.   :30.05   Kukaklek  : 1                  
+##                                   (Other)   :10                  
+##          campaign    location          abrasion
+##  Crater Floor:9   01     : 1   Alfalfa     :2  
+##  Delta Front :7   02     : 1   Bellegrade  :2  
+##                   03     : 1   Berry Hollow:2  
+##                   04     : 1   Dourbes     :2  
+##                   05     : 1   Novarupta   :2  
+##                   06     : 1   Quartier    :2  
+##                   (Other):10   (Other)     :4
+
# Make the matrix of just mineral percentage measurements
+pixl.matrix <- pixl.df[,2:14] %>% scale()
+
+# Review the structure
+str(pixl.matrix)
+
##  num [1:16, 1:13] 1.928 1.338 -0.498 -0.538 1.225 ...
+##  - attr(*, "dimnames")=List of 2
+##   ..$ : NULL
+##   ..$ : chr [1:13] "Na20" "Mgo" "Al203" "Si02" ...
+##  - attr(*, "scaled:center")= Named num [1:13] 2.672 11.682 5.072 38.554 0.651 ...
+##   ..- attr(*, "names")= chr [1:13] "Na20" "Mgo" "Al203" "Si02" ...
+##  - attr(*, "scaled:scale")= Named num [1:13] 1.492 7.957 3.75 11.026 0.694 ...
+##   ..- attr(*, "names")= chr [1:13] "Na20" "Mgo" "Al203" "Si02" ...
+
wssplot <- function(data, nc=15, seed=10){
+  wss <- data.frame(cluster=1:nc, quality=c(0))
+  for (i in 1:nc){
+    set.seed(seed)
+    wss[i,2] <- kmeans(data, centers=i)$tot.withinss
+  }
+  ggplot(data=wss,aes(x=cluster,y=quality)) + 
+    geom_line() + 
+    ggtitle("Quality of k-means by Cluster")
+}
+
+# Apply `wssplot()` to our PIXL data
+wssplot(pixl.matrix, nc=8, seed=2)
+

Smaller quality values: After scaling, the quality values (or WSS values) are significantly lower, starting at around 200. This indicates that the features have been normalized, ensuring that all features contribute equally to the clustering process. This prevents high-value features from dominating the distance calculations and ensures a more balanced approach.

+

Smoother WSS curve: The reduction in quality values is much more smooth, indicating that the features have a more balanced influence on the clustering. Each feature contributes equally after scaling, leading to more consistent and reasonable clustering results.

+
set.seed(2)
+k <- 5
+km <- kmeans(pixl.matrix,k)
+
+
+pheatmap(km$centers,scale="none")
+

+
# cluster result
+print(km$cluster)
+
##  [1] 1 1 4 4 2 4 4 2 2 5 5 3 3 5 5 3
+
print(km$centers)
+
##         Na20        Mgo        Al203       Si02        P205        S03
+## 1  1.6332256 -1.1634882  0.584802916  0.2254886  2.23932342 -0.3489424
+## 2  1.2245004 -1.3765168  1.740742791  1.6820388  0.27203366 -0.6094593
+## 3 -0.4729375  0.1505025  0.009277295 -0.5835043 -0.08827582  1.9970458
+## 4 -0.5276575  0.3427938 -0.719129262  0.1384221 -0.46299768 -0.5506760
+## 5 -0.8526275  1.1584610 -0.885787260 -1.0750673 -0.79448240 -0.3155428
+##           Cl        K20        Cao        Ti02      Cr203        Mno
+## 1  0.4563046  0.4589407  2.0620376  2.12133788 -0.5464895  0.3855410
+## 2  0.1796399  1.8640052  0.3203040 -0.41924125 -0.5791157 -0.5677967
+## 3 -0.9218954 -0.6354563 -0.4017736 -0.13289300 -0.4105468 -1.5211343
+## 4 -0.7502608 -0.5436682 -0.3846221  0.02855867 -0.1182701  1.2687802
+## 5  1.0788001 -0.6072138 -0.5852945 -0.67512692  1.1337618  0.1051475
+##         FeO-T
+## 1 -0.07982037
+## 2 -1.38478322
+## 3 -0.84322786
+## 4  0.90079975
+## 5  0.81011875
+
print(km$tot.withinss)
+
## [1] 25.17972
+

More balanced color distribution: After scaling, all features are normalized to a similar range. This results in a more balanced contribution from each feature to the clustering process, as reflected by the more uniform color distribution. Now, features such as K2O also show out notable color differences, indicating they play a more significant role in clustering after scaling.

+

More reasonable clustering results: By standardizing the features to the same scale, the clustering results are no longer dominated by high-value features. Each feature contributes more equally to the cluster centers, leading to smoother transitions in the feature values and a more reliable clustering outcome.

+
pca_result <- prcomp(pixl.matrix, scale=TRUE)
+pca_data <- data.frame(pca_result$x[, 1:2], cluster=km$cluster)
+
+# visualize
+ggplot(pca_data, aes(x=PC1, y=PC2, color=factor(cluster))) +
+  geom_point(size=4) +
+  ggtitle("K-means Clustering Results (PCA Reduced Data)") +
+  theme_minimal()
+

+
# Perform the PCA on the matrix `pixl_trim.mat` we created earlier
+
+pixl.matrix.pca <- prcomp(pixl.matrix, scale=FALSE)
+
+# generate the Scree plot
+ggscreeplot(pixl.matrix.pca)
+

+
# clusters sizes are in the km object produced by kmeans
+cluster.df<-data.frame(cluster= 1:5, size=km$size)
+
+ggbiplot::ggbiplot(pixl.matrix.pca,
+                   labels = pixl.df$type,
+                   groups = as.factor(km$cluster)) +
+  xlim(-2,2) + ylim(-2,2) 
+

Variable Direction and Distribution: The variables (e.g., SiO2, FeO-T, Mno, etc.) are spread out in a balanced radial pattern. The arrows representing the variables have relatively equal lengths, indicating that each feature has a balanced influence on the results. Since the data has been scaled, each variable contributes similarly in the PCA calculation, preventing certain features from dominating the clustering due to their value range.

+
+
+

3.3 Data Set C: Load the LIBS Data

+

The LIBS data provides summaries of the mineral compositions measured at selected sample sites by the LIBS instrument, part of the Perseverance SuperCam.

+
# Load the saved LIBS data with locations added
+libs.df <- readRDS("/academics/MATP-4910-F24/DAR-Mars-F24/Data/supercam_libs_moc_loc.Rds")
+
+#Drop  features that are not to be used in the analysis for this notebook
+libs.df <- libs.df %>% 
+  select(!(c(distance_mm,Tot.Em.,SiO2_stdev,TiO2_stdev,Al2O3_stdev,FeOT_stdev,
+             MgO_stdev,Na2O_stdev,CaO_stdev,K2O_stdev,Total)))
+
+# Convert the points to numeric
+libs.df$point <- as.numeric(libs.df$point)
+
+# Review what we have
+summary(libs.df)
+
##       sol              lat             lon           target         
+##  Min.   :  15.0   Min.   :18.43   Min.   :77.34   Length:1932       
+##  1st Qu.: 281.0   1st Qu.:18.44   1st Qu.:77.36   Class :character  
+##  Median : 557.0   Median :18.46   Median :77.40   Mode  :character  
+##  Mean   : 565.1   Mean   :18.46   Mean   :77.40                     
+##  3rd Qu.: 872.0   3rd Qu.:18.48   3rd Qu.:77.44                     
+##  Max.   :1019.0   Max.   :18.50   Max.   :77.45                     
+##      point             SiO2            TiO2            Al2O3       
+##  Min.   : 1.000   Min.   : 0.00   Min.   :0.0000   Min.   : 0.000  
+##  1st Qu.: 3.000   1st Qu.:42.04   1st Qu.:0.0300   1st Qu.: 3.080  
+##  Median : 5.000   Median :45.80   Median :0.3200   Median : 4.925  
+##  Mean   : 5.776   Mean   :43.47   Mean   :0.3719   Mean   : 6.246  
+##  3rd Qu.: 8.000   3rd Qu.:49.23   3rd Qu.:0.6400   3rd Qu.: 8.533  
+##  Max.   :28.000   Max.   :76.12   Max.   :2.4000   Max.   :38.350  
+##       FeOT            MgO             CaO              Na2O       
+##  Min.   : 0.29   Min.   : 0.29   Min.   : 0.080   Min.   :0.0000  
+##  1st Qu.:13.27   1st Qu.: 5.72   1st Qu.: 1.830   1st Qu.:0.9775  
+##  Median :20.21   Median :12.78   Median : 3.625   Median :1.5200  
+##  Mean   :20.07   Mean   :16.47   Mean   : 4.726   Mean   :1.7600  
+##  3rd Qu.:25.45   3rd Qu.:27.83   3rd Qu.: 4.622   3rd Qu.:2.4000  
+##  Max.   :82.68   Max.   :45.21   Max.   :52.130   Max.   :7.5200  
+##       K2O         
+##  Min.   : 0.0000  
+##  1st Qu.: 0.0000  
+##  Median : 0.3000  
+##  Mean   : 0.5909  
+##  3rd Qu.: 0.7800  
+##  Max.   :34.8700
+
# Make the a matrix contain only the libs measurements for each mineral
+libs.matrix <- as.matrix(libs.df[,6:13]) 
+
+# Check to see scaling
+str(libs.matrix)
+
##  num [1:1932, 1:8] 49.7 55.8 61.2 51 48 ...
+##  - attr(*, "dimnames")=List of 2
+##   ..$ : NULL
+##   ..$ : chr [1:8] "SiO2" "TiO2" "Al2O3" "FeOT" ...
+
+
+

3.4 Dataset D: Load the SHERLOC Data

+

The SHERLOC data you will be using for this lab is the result of scientists’ interpretations of extensive spectral analysis of abrasion samples provided by the SHERLOC instrument.

+

NOTE: This dataset presents minerals as rows and sample sites as columns. You’ll probably want to rotate the dataset for easier analysis….

+
# Read in data as provided.  
+sherloc_abrasion_raw <- readRDS("/academics/MATP-4910-F24/DAR-Mars-F24/Data/abrasions_sherloc_samples.Rds")
+
+# Clean up data types
+sherloc_abrasion_raw$Mineral<-as.factor(sherloc_abrasion_raw$Mineral)
+sherloc_abrasion_raw[sapply(sherloc_abrasion_raw, is.character)] <- lapply(sherloc_abrasion_raw[sapply(sherloc_abrasion_raw, is.character)], 
+                                       as.numeric)
+# Transform NA's to 0
+sherloc_abrasion_raw <- sherloc_abrasion_raw %>% replace(is.na(.), 0)
+
+# Reformat data so that rows are "abrasions" and columns list the presence of minerals. 
+# Do this by "pivoting" to a long format, and then back to the desired wide format.  
+
+sherloc_long <- sherloc_abrasion_raw %>%
+  pivot_longer(!Mineral, names_to = "Name", values_to = "Presence")
+
+# Make abrasion a factor 
+sherloc_long$Name <- as.factor(sherloc_long$Name)
+
+# Make it a matrix
+sherloc.matrix <- sherloc_long %>%
+  pivot_wider(names_from = Mineral, values_from = Presence)
+
+# Get sample information from PIXL and add to measurements -- assumes order is the same
+
+sherloc.df <- cbind(pixl.df[,c("sample","type","campaign","abrasion")],sherloc.matrix)
+
+# Review what we have
+summary(sherloc.df)
+
##      sample               type           campaign         abrasion
+##  Min.   : 1.00   Igneous    :8   Crater Floor:9   Alfalfa     :2  
+##  1st Qu.: 4.75   N/A        :1   Delta Front :7   Bellegrade  :2  
+##  Median : 8.50   Sedimentary:7                    Berry Hollow:2  
+##  Mean   : 8.50                                    Dourbes     :2  
+##  3rd Qu.:12.25                                    Novarupta   :2  
+##  Max.   :16.00                                    Quartier    :2  
+##                                                   (Other)     :4  
+##          Name     Plagioclase        Sulfate         Ca-sulfate    
+##  Atsah     : 1   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
+##  Bearwallow: 1   1st Qu.:0.0000   1st Qu.:0.1875   1st Qu.:0.0000  
+##  Coulettes : 1   Median :0.0000   Median :1.0000   Median :0.0000  
+##  Hahonih   : 1   Mean   :0.1875   Mean   :0.6562   Mean   :0.3438  
+##  Hazeltop  : 1   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:1.0000  
+##  Kukaklek  : 1   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
+##  (Other)   :10                                                     
+##  Hydrated Ca-sulfate   Mg-sulfate     Hydrated Sulfates Hydrated Mg-Fe sulfate
+##  Min.   :0.000       Min.   :0.0000   Min.   :0.000     Min.   :0.0000        
+##  1st Qu.:0.000       1st Qu.:0.0000   1st Qu.:0.000     1st Qu.:0.0000        
+##  Median :0.000       Median :0.0000   Median :0.000     Median :0.0000        
+##  Mean   :0.125       Mean   :0.1875   Mean   :0.125     Mean   :0.1875        
+##  3rd Qu.:0.000       3rd Qu.:0.0000   3rd Qu.:0.000     3rd Qu.:0.0000        
+##  Max.   :1.000       Max.   :1.0000   Max.   :1.000     Max.   :1.0000        
+##                                                                               
+##   Perchlorates    Na-perchlorate    Amorphous Silicate   Phosphate     
+##  Min.   :0.0000   Min.   :0.00000   Min.   :0.0000     Min.   :0.0000  
+##  1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.0000     1st Qu.:0.0000  
+##  Median :0.0000   Median :0.00000   Median :0.0000     Median :0.0000  
+##  Mean   :0.0625   Mean   :0.03125   Mean   :0.1406     Mean   :0.2031  
+##  3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.2500     3rd Qu.:0.3125  
+##  Max.   :1.0000   Max.   :0.50000   Max.   :0.5000     Max.   :1.0000  
+##                                                                        
+##     Pyroxene         Olivine         Carbonate      Fe-Mg carbonate
+##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.000  
+##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.4375   1st Qu.:0.000  
+##  Median :1.0000   Median :0.6250   Median :1.0000   Median :0.000  
+##  Mean   :0.6875   Mean   :0.5312   Mean   :0.7344   Mean   :0.125  
+##  3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:0.000  
+##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.000  
+##                                                                    
+##  Hydrated Carbonates Disordered Silicates    Feldspar         Quartz       
+##  Min.   :0           Min.   :0.000        Min.   :0.000   Min.   :0.00000  
+##  1st Qu.:0           1st Qu.:0.000        1st Qu.:0.000   1st Qu.:0.00000  
+##  Median :0           Median :0.000        Median :0.000   Median :0.00000  
+##  Mean   :0           Mean   :0.125        Mean   :0.125   Mean   :0.03125  
+##  3rd Qu.:0           3rd Qu.:0.000        3rd Qu.:0.000   3rd Qu.:0.00000  
+##  Max.   :0           Max.   :1.000        Max.   :1.000   Max.   :0.25000  
+##                                                                            
+##     Apatite        FeTi oxides         Halite          Iron oxide    
+##  Min.   :0.0000   Min.   :0.0000   Min.   :0.00000   Min.   :0.0000  
+##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.0000  
+##  Median :0.0000   Median :0.0000   Median :0.00000   Median :0.0000  
+##  Mean   :0.1406   Mean   :0.1406   Mean   :0.04688   Mean   :0.2812  
+##  3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.5000  
+##  Max.   :1.0000   Max.   :1.0000   Max.   :0.25000   Max.   :1.0000  
+##                                                                      
+##  Hydrated Iron oxide Organic matter   Sulfate+Organic matter
+##  Min.   :0.00000     Min.   :0.0000   Min.   :0.0000        
+##  1st Qu.:0.00000     1st Qu.:0.0000   1st Qu.:0.0000        
+##  Median :0.00000     Median :1.0000   Median :0.0000        
+##  Mean   :0.01562     Mean   :0.5938   Mean   :0.2188        
+##  3rd Qu.:0.00000     3rd Qu.:1.0000   3rd Qu.:0.2500        
+##  Max.   :0.25000     Max.   :1.0000   Max.   :1.0000        
+##                                                             
+##  Other hydrated phases Phyllosilicates      Chlorite     
+##  Min.   :0.0000        Min.   :0.00000   Min.   :0.0000  
+##  1st Qu.:0.0000        1st Qu.:0.00000   1st Qu.:0.0000  
+##  Median :0.2500        Median :0.00000   Median :0.0000  
+##  Mean   :0.4375        Mean   :0.09375   Mean   :0.0625  
+##  3rd Qu.:1.0000        3rd Qu.:0.06250   3rd Qu.:0.0000  
+##  Max.   :1.0000        Max.   :0.50000   Max.   :0.5000  
+##                                                          
+##  Kaolinite (hydrous Al-clay)    Chromite        Ilmenite     Zircon/Baddeleyite
+##  Min.   :0.0000              Min.   :0.000   Min.   :0.000   Min.   :0.000     
+##  1st Qu.:0.0000              1st Qu.:0.000   1st Qu.:0.000   1st Qu.:0.000     
+##  Median :0.0000              Median :0.000   Median :0.000   Median :0.000     
+##  Mean   :0.1875              Mean   :0.125   Mean   :0.125   Mean   :0.125     
+##  3rd Qu.:0.0000              3rd Qu.:0.000   3rd Qu.:0.000   3rd Qu.:0.000     
+##  Max.   :1.0000              Max.   :1.000   Max.   :1.000   Max.   :1.000     
+##                                                                                
+##  Fe-Mg-clay minerals    Spinels      
+##  Min.   :0.0000      Min.   :0.0000  
+##  1st Qu.:0.0000      1st Qu.:0.0000  
+##  Median :0.0000      Median :0.0000  
+##  Mean   :0.1875      Mean   :0.0625  
+##  3rd Qu.:0.0000      3rd Qu.:0.0000  
+##  Max.   :1.0000      Max.   :0.5000  
+## 
+
# Measurements are everything except first column
+sherloc.matrix<-as.matrix(sherloc.matrix[,-1])
+
+# Sherlock measurement matrix
+# Review the structure 
+str(sherloc.matrix)
+
##  num [1:16, 1:35] 1 1 1 0 0 0 0 0 0 0 ...
+##  - attr(*, "dimnames")=List of 2
+##   ..$ : NULL
+##   ..$ : chr [1:35] "Plagioclase" "Sulfate" "Ca-sulfate" "Hydrated Ca-sulfate" ...
+
+
+

3.5 Data Set E: PIXL + Sherloc

+
# Combine PIXL and SHERLOC dataframes 
+pixl_sherloc.df <- cbind(pixl.df,sherloc.df )
+
+# Review what we have
+summary(pixl_sherloc.df)
+
##      sample           Na20            Mgo             Al203       
+##  Min.   : 1.00   Min.   :1.000   Min.   : 0.730   Min.   : 1.700  
+##  1st Qu.: 4.75   1st Qu.:1.853   1st Qu.: 2.533   1st Qu.: 2.220  
+##  Median : 8.50   Median :1.900   Median :12.800   Median : 3.710  
+##  Mean   : 8.50   Mean   :2.672   Mean   :11.682   Mean   : 5.072  
+##  3rd Qu.:12.25   3rd Qu.:4.500   3rd Qu.:19.100   3rd Qu.: 7.117  
+##  Max.   :16.00   Max.   :5.550   Max.   :22.700   Max.   :11.600  
+##                                                                   
+##       Si02            P205             S03               Cl       
+##  Min.   :22.60   Min.   :0.1000   Min.   : 0.780   Min.   :0.400  
+##  1st Qu.:31.22   1st Qu.:0.2350   1st Qu.: 1.495   1st Qu.:0.940  
+##  Median :38.85   Median :0.5250   Median : 2.600   Median :1.740  
+##  Mean   :38.55   Mean   :0.6512   Mean   : 5.562   Mean   :1.846  
+##  3rd Qu.:41.17   3rd Qu.:0.8400   3rd Qu.: 3.800   3rd Qu.:2.080  
+##  Max.   :57.10   Max.   :2.7600   Max.   :21.530   Max.   :4.500  
+##                                                                   
+##       K20              Cao             Ti02            Cr203      
+##  Min.   :0.0000   Min.   :1.500   Min.   :0.2000   Min.   :0.000  
+##  1st Qu.:0.1600   1st Qu.:2.655   1st Qu.:0.5900   1st Qu.:0.025  
+##  Median :0.2000   Median :3.120   Median :0.7000   Median :0.155  
+##  Mean   :0.5800   Mean   :3.688   Mean   :0.8194   Mean   :0.355  
+##  3rd Qu.:0.8275   3rd Qu.:4.310   3rd Qu.:0.9900   3rd Qu.:0.290  
+##  Max.   :1.9000   Max.   :7.770   Max.   :2.4900   Max.   :1.900  
+##                                                                   
+##       Mno             FeO-T               name             type  
+##  Min.   :0.1000   Min.   :13.24   Atsah     : 1   Igneous    :8  
+##  1st Qu.:0.2800   1st Qu.:16.71   Bearwallow: 1   N/A        :1  
+##  Median :0.4000   Median :23.86   Coulettes : 1   Sedimentary:7  
+##  Mean   :0.3812   Mean   :21.45   Hahonih   : 1                  
+##  3rd Qu.:0.4900   3rd Qu.:25.70   Hazeltop  : 1                  
+##  Max.   :0.6900   Max.   :30.05   Kukaklek  : 1                  
+##                                   (Other)   :10                  
+##          campaign    location          abrasion     sample               type  
+##  Crater Floor:9   01     : 1   Alfalfa     :2   Min.   : 1.00   Igneous    :8  
+##  Delta Front :7   02     : 1   Bellegrade  :2   1st Qu.: 4.75   N/A        :1  
+##                   03     : 1   Berry Hollow:2   Median : 8.50   Sedimentary:7  
+##                   04     : 1   Dourbes     :2   Mean   : 8.50                  
+##                   05     : 1   Novarupta   :2   3rd Qu.:12.25                  
+##                   06     : 1   Quartier    :2   Max.   :16.00                  
+##                   (Other):10   (Other)     :4                                  
+##          campaign         abrasion         Name     Plagioclase    
+##  Crater Floor:9   Alfalfa     :2   Atsah     : 1   Min.   :0.0000  
+##  Delta Front :7   Bellegrade  :2   Bearwallow: 1   1st Qu.:0.0000  
+##                   Berry Hollow:2   Coulettes : 1   Median :0.0000  
+##                   Dourbes     :2   Hahonih   : 1   Mean   :0.1875  
+##                   Novarupta   :2   Hazeltop  : 1   3rd Qu.:0.0000  
+##                   Quartier    :2   Kukaklek  : 1   Max.   :1.0000  
+##                   (Other)     :4   (Other)   :10                   
+##     Sulfate         Ca-sulfate     Hydrated Ca-sulfate   Mg-sulfate    
+##  Min.   :0.0000   Min.   :0.0000   Min.   :0.000       Min.   :0.0000  
+##  1st Qu.:0.1875   1st Qu.:0.0000   1st Qu.:0.000       1st Qu.:0.0000  
+##  Median :1.0000   Median :0.0000   Median :0.000       Median :0.0000  
+##  Mean   :0.6562   Mean   :0.3438   Mean   :0.125       Mean   :0.1875  
+##  3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:0.000       3rd Qu.:0.0000  
+##  Max.   :1.0000   Max.   :1.0000   Max.   :1.000       Max.   :1.0000  
+##                                                                        
+##  Hydrated Sulfates Hydrated Mg-Fe sulfate  Perchlorates    Na-perchlorate   
+##  Min.   :0.000     Min.   :0.0000         Min.   :0.0000   Min.   :0.00000  
+##  1st Qu.:0.000     1st Qu.:0.0000         1st Qu.:0.0000   1st Qu.:0.00000  
+##  Median :0.000     Median :0.0000         Median :0.0000   Median :0.00000  
+##  Mean   :0.125     Mean   :0.1875         Mean   :0.0625   Mean   :0.03125  
+##  3rd Qu.:0.000     3rd Qu.:0.0000         3rd Qu.:0.0000   3rd Qu.:0.00000  
+##  Max.   :1.000     Max.   :1.0000         Max.   :1.0000   Max.   :0.50000  
+##                                                                             
+##  Amorphous Silicate   Phosphate         Pyroxene         Olivine      
+##  Min.   :0.0000     Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
+##  1st Qu.:0.0000     1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
+##  Median :0.0000     Median :0.0000   Median :1.0000   Median :0.6250  
+##  Mean   :0.1406     Mean   :0.2031   Mean   :0.6875   Mean   :0.5312  
+##  3rd Qu.:0.2500     3rd Qu.:0.3125   3rd Qu.:1.0000   3rd Qu.:1.0000  
+##  Max.   :0.5000     Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
+##                                                                       
+##    Carbonate      Fe-Mg carbonate Hydrated Carbonates Disordered Silicates
+##  Min.   :0.0000   Min.   :0.000   Min.   :0           Min.   :0.000       
+##  1st Qu.:0.4375   1st Qu.:0.000   1st Qu.:0           1st Qu.:0.000       
+##  Median :1.0000   Median :0.000   Median :0           Median :0.000       
+##  Mean   :0.7344   Mean   :0.125   Mean   :0           Mean   :0.125       
+##  3rd Qu.:1.0000   3rd Qu.:0.000   3rd Qu.:0           3rd Qu.:0.000       
+##  Max.   :1.0000   Max.   :1.000   Max.   :0           Max.   :1.000       
+##                                                                           
+##     Feldspar         Quartz           Apatite        FeTi oxides    
+##  Min.   :0.000   Min.   :0.00000   Min.   :0.0000   Min.   :0.0000  
+##  1st Qu.:0.000   1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.0000  
+##  Median :0.000   Median :0.00000   Median :0.0000   Median :0.0000  
+##  Mean   :0.125   Mean   :0.03125   Mean   :0.1406   Mean   :0.1406  
+##  3rd Qu.:0.000   3rd Qu.:0.00000   3rd Qu.:0.0000   3rd Qu.:0.0000  
+##  Max.   :1.000   Max.   :0.25000   Max.   :1.0000   Max.   :1.0000  
+##                                                                     
+##      Halite          Iron oxide     Hydrated Iron oxide Organic matter  
+##  Min.   :0.00000   Min.   :0.0000   Min.   :0.00000     Min.   :0.0000  
+##  1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.00000     1st Qu.:0.0000  
+##  Median :0.00000   Median :0.0000   Median :0.00000     Median :1.0000  
+##  Mean   :0.04688   Mean   :0.2812   Mean   :0.01562     Mean   :0.5938  
+##  3rd Qu.:0.00000   3rd Qu.:0.5000   3rd Qu.:0.00000     3rd Qu.:1.0000  
+##  Max.   :0.25000   Max.   :1.0000   Max.   :0.25000     Max.   :1.0000  
+##                                                                         
+##  Sulfate+Organic matter Other hydrated phases Phyllosilicates  
+##  Min.   :0.0000         Min.   :0.0000        Min.   :0.00000  
+##  1st Qu.:0.0000         1st Qu.:0.0000        1st Qu.:0.00000  
+##  Median :0.0000         Median :0.2500        Median :0.00000  
+##  Mean   :0.2188         Mean   :0.4375        Mean   :0.09375  
+##  3rd Qu.:0.2500         3rd Qu.:1.0000        3rd Qu.:0.06250  
+##  Max.   :1.0000         Max.   :1.0000        Max.   :0.50000  
+##                                                                
+##     Chlorite      Kaolinite (hydrous Al-clay)    Chromite        Ilmenite    
+##  Min.   :0.0000   Min.   :0.0000              Min.   :0.000   Min.   :0.000  
+##  1st Qu.:0.0000   1st Qu.:0.0000              1st Qu.:0.000   1st Qu.:0.000  
+##  Median :0.0000   Median :0.0000              Median :0.000   Median :0.000  
+##  Mean   :0.0625   Mean   :0.1875              Mean   :0.125   Mean   :0.125  
+##  3rd Qu.:0.0000   3rd Qu.:0.0000              3rd Qu.:0.000   3rd Qu.:0.000  
+##  Max.   :0.5000   Max.   :1.0000              Max.   :1.000   Max.   :1.000  
+##                                                                              
+##  Zircon/Baddeleyite Fe-Mg-clay minerals    Spinels      
+##  Min.   :0.000      Min.   :0.0000      Min.   :0.0000  
+##  1st Qu.:0.000      1st Qu.:0.0000      1st Qu.:0.0000  
+##  Median :0.000      Median :0.0000      Median :0.0000  
+##  Mean   :0.125      Mean   :0.1875      Mean   :0.0625  
+##  3rd Qu.:0.000      3rd Qu.:0.0000      3rd Qu.:0.0000  
+##  Max.   :1.000      Max.   :1.0000      Max.   :0.5000  
+## 
+
# Combine PIXL and SHERLOC matrices
+pixl_sherloc.matrix<-cbind(pixl.matrix,sherloc.matrix)
+
+# Review the structure of our matrix
+str(pixl_sherloc.matrix)
+
##  num [1:16, 1:48] 1.928 1.338 -0.498 -0.538 1.225 ...
+##  - attr(*, "dimnames")=List of 2
+##   ..$ : NULL
+##   ..$ : chr [1:48] "Na20" "Mgo" "Al203" "Si02" ...
+
+
+

3.6 Data Set F: PIXL + Lithography

+

Create data and matrix from prior datasets

+
# Combine our PIXL and Lithology dataframes
+pixl_lithology.df <- cbind(pixl.df,lithology.df )
+
+# Review what we have
+summary(pixl_lithology.df)
+
##      sample           Na20            Mgo             Al203       
+##  Min.   : 1.00   Min.   :1.000   Min.   : 0.730   Min.   : 1.700  
+##  1st Qu.: 4.75   1st Qu.:1.853   1st Qu.: 2.533   1st Qu.: 2.220  
+##  Median : 8.50   Median :1.900   Median :12.800   Median : 3.710  
+##  Mean   : 8.50   Mean   :2.672   Mean   :11.682   Mean   : 5.072  
+##  3rd Qu.:12.25   3rd Qu.:4.500   3rd Qu.:19.100   3rd Qu.: 7.117  
+##  Max.   :16.00   Max.   :5.550   Max.   :22.700   Max.   :11.600  
+##                                                                   
+##       Si02            P205             S03               Cl       
+##  Min.   :22.60   Min.   :0.1000   Min.   : 0.780   Min.   :0.400  
+##  1st Qu.:31.22   1st Qu.:0.2350   1st Qu.: 1.495   1st Qu.:0.940  
+##  Median :38.85   Median :0.5250   Median : 2.600   Median :1.740  
+##  Mean   :38.55   Mean   :0.6512   Mean   : 5.562   Mean   :1.846  
+##  3rd Qu.:41.17   3rd Qu.:0.8400   3rd Qu.: 3.800   3rd Qu.:2.080  
+##  Max.   :57.10   Max.   :2.7600   Max.   :21.530   Max.   :4.500  
+##                                                                   
+##       K20              Cao             Ti02            Cr203      
+##  Min.   :0.0000   Min.   :1.500   Min.   :0.2000   Min.   :0.000  
+##  1st Qu.:0.1600   1st Qu.:2.655   1st Qu.:0.5900   1st Qu.:0.025  
+##  Median :0.2000   Median :3.120   Median :0.7000   Median :0.155  
+##  Mean   :0.5800   Mean   :3.688   Mean   :0.8194   Mean   :0.355  
+##  3rd Qu.:0.8275   3rd Qu.:4.310   3rd Qu.:0.9900   3rd Qu.:0.290  
+##  Max.   :1.9000   Max.   :7.770   Max.   :2.4900   Max.   :1.900  
+##                                                                   
+##       Mno             FeO-T               name             type  
+##  Min.   :0.1000   Min.   :13.24   Atsah     : 1   Igneous    :8  
+##  1st Qu.:0.2800   1st Qu.:16.71   Bearwallow: 1   N/A        :1  
+##  Median :0.4000   Median :23.86   Coulettes : 1   Sedimentary:7  
+##  Mean   :0.3812   Mean   :21.45   Hahonih   : 1                  
+##  3rd Qu.:0.4900   3rd Qu.:25.70   Hazeltop  : 1                  
+##  Max.   :0.6900   Max.   :30.05   Kukaklek  : 1                  
+##                                   (Other)   :10                  
+##          campaign    location          abrasion     sample              name   
+##  Crater Floor:9   01     : 1   Alfalfa     :2   Min.   : 1.00   Atsah     : 1  
+##  Delta Front :7   02     : 1   Bellegrade  :2   1st Qu.: 4.75   Bearwallow: 1  
+##                   03     : 1   Berry Hollow:2   Median : 8.50   Coulettes : 1  
+##                   04     : 1   Dourbes     :2   Mean   : 8.50   Hahonih   : 1  
+##                   05     : 1   Novarupta   :2   3rd Qu.:12.25   Hazeltop  : 1  
+##                   06     : 1   Quartier    :2   Max.   :16.00   Kukaklek  : 1  
+##                   (Other):10   (Other)     :4                   (Other)   :10  
+##        SampleType         campaign         abrasion feldspar plagioclase
+##  atmospheric: 1   Crater Floor:9   Alfalfa     :2   0:14     0:13       
+##  regolith   : 0   Delta Front :7   Bellegarde  :2   1: 2     1: 3       
+##  rock core  :15   Margin Unit :0   Berry Hollow:2                       
+##                                    Dourbes     :2                       
+##                                    Novarupta   :2                       
+##                                    Quartier    :2                       
+##                                    (Other)     :4                       
+##  pyroxene olivine quartz apatite FeTi_Oxides Iron_Oxide Sulfate Perchlorates
+##  0: 5     0: 6    0:14   0:13    0:13        0:9        0: 4    0:15        
+##  1:11     1:10    1: 2   1: 3    1: 3        1:7        1:12    1: 1        
+##                                                                             
+##                                                                             
+##                                                                             
+##                                                                             
+##                                                                             
+##  Phosphate Ca_Sulfate Carbonate Fe_Mg_clay Fe_Mg_carbonate Mg_sulfate
+##  0:11      0:10       0: 1      0:13       0:14            0:13      
+##  1: 5      1: 6       1:15      1: 3       1: 2            1: 3      
+##                                                                      
+##                                                                      
+##                                                                      
+##                                                                      
+##                                                                      
+##  Phyllosilicates Chlorite Halite Organic_matter Hydrated_Ca_Sulfate
+##  0:12            0:14     0:13   0: 5           0:14               
+##  1: 4            1: 2     1: 3   1:11           1: 2               
+##                                                                    
+##                                                                    
+##                                                                    
+##                                                                    
+##                                                                    
+##  Hydrated_Sulfates Hydrated_Mg_Fe_Sulfate Na_Perchlorate Amorphous_Silicate
+##  0:14              0:13                   0:15           0:9               
+##  1: 2              1: 3                   1: 1           1:7               
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##  Hydrated_Carbonates Disordered_Silicates Hydrated_Iron_Oxide
+##  0:16                0:14                 0:15               
+##                      1: 2                 1: 1               
+##                                                              
+##                                                              
+##                                                              
+##                                                              
+##                                                              
+##  Sulfate+Organic_Matter Other_hydrated_phases Kaolinite Chromite Ilmenite
+##  0:11                   0:8                   0:13      0:14     0:14    
+##  1: 5                   1:8                   1: 3      1: 2     1: 2    
+##                                                                          
+##                                                                          
+##                                                                          
+##                                                                          
+##                                                                          
+##  Zircon/Baddeleyite Spinels
+##  0:14               0:14   
+##  1: 2               1: 2   
+##                            
+##                            
+##                            
+##                            
+## 
+
# Combine PIXL and Lithology matrices
+pixl_lithology.matrix<-cbind(pixl.matrix,lithology.matrix)
+
+# Review the structure
+str(pixl_lithology.matrix)
+
##  num [1:16, 1:48] 1.928 1.338 -0.498 -0.538 1.225 ...
+##  - attr(*, "dimnames")=List of 2
+##   ..$ : NULL
+##   ..$ : chr [1:48] "Na20" "Mgo" "Al203" "Si02" ...
+
+
+

3.7 Data Set G: Sherloc + Lithology

+

Create Data and matrix from prior datasets by taking on appropriate combinations.

+
# Combine the Lithology and SHERLOC dataframes
+sherloc_lithology.df <- cbind(sherloc.df,lithology.df )
+
+# Review what we have
+summary(sherloc_lithology.df)
+
##      sample               type           campaign         abrasion
+##  Min.   : 1.00   Igneous    :8   Crater Floor:9   Alfalfa     :2  
+##  1st Qu.: 4.75   N/A        :1   Delta Front :7   Bellegrade  :2  
+##  Median : 8.50   Sedimentary:7                    Berry Hollow:2  
+##  Mean   : 8.50                                    Dourbes     :2  
+##  3rd Qu.:12.25                                    Novarupta   :2  
+##  Max.   :16.00                                    Quartier    :2  
+##                                                   (Other)     :4  
+##          Name     Plagioclase        Sulfate         Ca-sulfate    
+##  Atsah     : 1   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
+##  Bearwallow: 1   1st Qu.:0.0000   1st Qu.:0.1875   1st Qu.:0.0000  
+##  Coulettes : 1   Median :0.0000   Median :1.0000   Median :0.0000  
+##  Hahonih   : 1   Mean   :0.1875   Mean   :0.6562   Mean   :0.3438  
+##  Hazeltop  : 1   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:1.0000  
+##  Kukaklek  : 1   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
+##  (Other)   :10                                                     
+##  Hydrated Ca-sulfate   Mg-sulfate     Hydrated Sulfates Hydrated Mg-Fe sulfate
+##  Min.   :0.000       Min.   :0.0000   Min.   :0.000     Min.   :0.0000        
+##  1st Qu.:0.000       1st Qu.:0.0000   1st Qu.:0.000     1st Qu.:0.0000        
+##  Median :0.000       Median :0.0000   Median :0.000     Median :0.0000        
+##  Mean   :0.125       Mean   :0.1875   Mean   :0.125     Mean   :0.1875        
+##  3rd Qu.:0.000       3rd Qu.:0.0000   3rd Qu.:0.000     3rd Qu.:0.0000        
+##  Max.   :1.000       Max.   :1.0000   Max.   :1.000     Max.   :1.0000        
+##                                                                               
+##   Perchlorates    Na-perchlorate    Amorphous Silicate   Phosphate     
+##  Min.   :0.0000   Min.   :0.00000   Min.   :0.0000     Min.   :0.0000  
+##  1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.0000     1st Qu.:0.0000  
+##  Median :0.0000   Median :0.00000   Median :0.0000     Median :0.0000  
+##  Mean   :0.0625   Mean   :0.03125   Mean   :0.1406     Mean   :0.2031  
+##  3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.2500     3rd Qu.:0.3125  
+##  Max.   :1.0000   Max.   :0.50000   Max.   :0.5000     Max.   :1.0000  
+##                                                                        
+##     Pyroxene         Olivine         Carbonate      Fe-Mg carbonate
+##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.000  
+##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.4375   1st Qu.:0.000  
+##  Median :1.0000   Median :0.6250   Median :1.0000   Median :0.000  
+##  Mean   :0.6875   Mean   :0.5312   Mean   :0.7344   Mean   :0.125  
+##  3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:0.000  
+##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.000  
+##                                                                    
+##  Hydrated Carbonates Disordered Silicates    Feldspar         Quartz       
+##  Min.   :0           Min.   :0.000        Min.   :0.000   Min.   :0.00000  
+##  1st Qu.:0           1st Qu.:0.000        1st Qu.:0.000   1st Qu.:0.00000  
+##  Median :0           Median :0.000        Median :0.000   Median :0.00000  
+##  Mean   :0           Mean   :0.125        Mean   :0.125   Mean   :0.03125  
+##  3rd Qu.:0           3rd Qu.:0.000        3rd Qu.:0.000   3rd Qu.:0.00000  
+##  Max.   :0           Max.   :1.000        Max.   :1.000   Max.   :0.25000  
+##                                                                            
+##     Apatite        FeTi oxides         Halite          Iron oxide    
+##  Min.   :0.0000   Min.   :0.0000   Min.   :0.00000   Min.   :0.0000  
+##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.0000  
+##  Median :0.0000   Median :0.0000   Median :0.00000   Median :0.0000  
+##  Mean   :0.1406   Mean   :0.1406   Mean   :0.04688   Mean   :0.2812  
+##  3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.5000  
+##  Max.   :1.0000   Max.   :1.0000   Max.   :0.25000   Max.   :1.0000  
+##                                                                      
+##  Hydrated Iron oxide Organic matter   Sulfate+Organic matter
+##  Min.   :0.00000     Min.   :0.0000   Min.   :0.0000        
+##  1st Qu.:0.00000     1st Qu.:0.0000   1st Qu.:0.0000        
+##  Median :0.00000     Median :1.0000   Median :0.0000        
+##  Mean   :0.01562     Mean   :0.5938   Mean   :0.2188        
+##  3rd Qu.:0.00000     3rd Qu.:1.0000   3rd Qu.:0.2500        
+##  Max.   :0.25000     Max.   :1.0000   Max.   :1.0000        
+##                                                             
+##  Other hydrated phases Phyllosilicates      Chlorite     
+##  Min.   :0.0000        Min.   :0.00000   Min.   :0.0000  
+##  1st Qu.:0.0000        1st Qu.:0.00000   1st Qu.:0.0000  
+##  Median :0.2500        Median :0.00000   Median :0.0000  
+##  Mean   :0.4375        Mean   :0.09375   Mean   :0.0625  
+##  3rd Qu.:1.0000        3rd Qu.:0.06250   3rd Qu.:0.0000  
+##  Max.   :1.0000        Max.   :0.50000   Max.   :0.5000  
+##                                                          
+##  Kaolinite (hydrous Al-clay)    Chromite        Ilmenite     Zircon/Baddeleyite
+##  Min.   :0.0000              Min.   :0.000   Min.   :0.000   Min.   :0.000     
+##  1st Qu.:0.0000              1st Qu.:0.000   1st Qu.:0.000   1st Qu.:0.000     
+##  Median :0.0000              Median :0.000   Median :0.000   Median :0.000     
+##  Mean   :0.1875              Mean   :0.125   Mean   :0.125   Mean   :0.125     
+##  3rd Qu.:0.0000              3rd Qu.:0.000   3rd Qu.:0.000   3rd Qu.:0.000     
+##  Max.   :1.0000              Max.   :1.000   Max.   :1.000   Max.   :1.000     
+##                                                                                
+##  Fe-Mg-clay minerals    Spinels           sample              name   
+##  Min.   :0.0000      Min.   :0.0000   Min.   : 1.00   Atsah     : 1  
+##  1st Qu.:0.0000      1st Qu.:0.0000   1st Qu.: 4.75   Bearwallow: 1  
+##  Median :0.0000      Median :0.0000   Median : 8.50   Coulettes : 1  
+##  Mean   :0.1875      Mean   :0.0625   Mean   : 8.50   Hahonih   : 1  
+##  3rd Qu.:0.0000      3rd Qu.:0.0000   3rd Qu.:12.25   Hazeltop  : 1  
+##  Max.   :1.0000      Max.   :0.5000   Max.   :16.00   Kukaklek  : 1  
+##                                                       (Other)   :10  
+##        SampleType         campaign         abrasion feldspar plagioclase
+##  atmospheric: 1   Crater Floor:9   Alfalfa     :2   0:14     0:13       
+##  regolith   : 0   Delta Front :7   Bellegarde  :2   1: 2     1: 3       
+##  rock core  :15   Margin Unit :0   Berry Hollow:2                       
+##                                    Dourbes     :2                       
+##                                    Novarupta   :2                       
+##                                    Quartier    :2                       
+##                                    (Other)     :4                       
+##  pyroxene olivine quartz apatite FeTi_Oxides Iron_Oxide Sulfate Perchlorates
+##  0: 5     0: 6    0:14   0:13    0:13        0:9        0: 4    0:15        
+##  1:11     1:10    1: 2   1: 3    1: 3        1:7        1:12    1: 1        
+##                                                                             
+##                                                                             
+##                                                                             
+##                                                                             
+##                                                                             
+##  Phosphate Ca_Sulfate Carbonate Fe_Mg_clay Fe_Mg_carbonate Mg_sulfate
+##  0:11      0:10       0: 1      0:13       0:14            0:13      
+##  1: 5      1: 6       1:15      1: 3       1: 2            1: 3      
+##                                                                      
+##                                                                      
+##                                                                      
+##                                                                      
+##                                                                      
+##  Phyllosilicates Chlorite Halite Organic_matter Hydrated_Ca_Sulfate
+##  0:12            0:14     0:13   0: 5           0:14               
+##  1: 4            1: 2     1: 3   1:11           1: 2               
+##                                                                    
+##                                                                    
+##                                                                    
+##                                                                    
+##                                                                    
+##  Hydrated_Sulfates Hydrated_Mg_Fe_Sulfate Na_Perchlorate Amorphous_Silicate
+##  0:14              0:13                   0:15           0:9               
+##  1: 2              1: 3                   1: 1           1:7               
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##  Hydrated_Carbonates Disordered_Silicates Hydrated_Iron_Oxide
+##  0:16                0:14                 0:15               
+##                      1: 2                 1: 1               
+##                                                              
+##                                                              
+##                                                              
+##                                                              
+##                                                              
+##  Sulfate+Organic_Matter Other_hydrated_phases Kaolinite Chromite Ilmenite
+##  0:11                   0:8                   0:13      0:14     0:14    
+##  1: 5                   1:8                   1: 3      1: 2     1: 2    
+##                                                                          
+##                                                                          
+##                                                                          
+##                                                                          
+##                                                                          
+##  Zircon/Baddeleyite Spinels
+##  0:14               0:14   
+##  1: 2               1: 2   
+##                            
+##                            
+##                            
+##                            
+## 
+
# Combine the Lithology and SHERLOC matrices
+sherloc_lithology.matrix<-cbind(sherloc.matrix,lithology.matrix)
+
+# Review the resulting matrix
+str(sherloc_lithology.matrix)
+
##  num [1:16, 1:70] 1 1 1 0 0 0 0 0 0 0 ...
+##  - attr(*, "dimnames")=List of 2
+##   ..$ : NULL
+##   ..$ : chr [1:70] "Plagioclase" "Sulfate" "Ca-sulfate" "Hydrated Ca-sulfate" ...
+
+
+

3.8 Data Set H: Sherloc + Lithology + PIXL

+

Create data frame and matrix from prior datasets by making on appropriate combinations.

+
# Combine the Lithology and SHERLOC dataframes
+sherloc_lithology_pixl.df <- cbind(sherloc.df,lithology.df, pixl.df )
+
+# Review what we have
+summary(sherloc_lithology_pixl.df)
+
##      sample               type           campaign         abrasion
+##  Min.   : 1.00   Igneous    :8   Crater Floor:9   Alfalfa     :2  
+##  1st Qu.: 4.75   N/A        :1   Delta Front :7   Bellegrade  :2  
+##  Median : 8.50   Sedimentary:7                    Berry Hollow:2  
+##  Mean   : 8.50                                    Dourbes     :2  
+##  3rd Qu.:12.25                                    Novarupta   :2  
+##  Max.   :16.00                                    Quartier    :2  
+##                                                   (Other)     :4  
+##          Name     Plagioclase        Sulfate         Ca-sulfate    
+##  Atsah     : 1   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
+##  Bearwallow: 1   1st Qu.:0.0000   1st Qu.:0.1875   1st Qu.:0.0000  
+##  Coulettes : 1   Median :0.0000   Median :1.0000   Median :0.0000  
+##  Hahonih   : 1   Mean   :0.1875   Mean   :0.6562   Mean   :0.3438  
+##  Hazeltop  : 1   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:1.0000  
+##  Kukaklek  : 1   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
+##  (Other)   :10                                                     
+##  Hydrated Ca-sulfate   Mg-sulfate     Hydrated Sulfates Hydrated Mg-Fe sulfate
+##  Min.   :0.000       Min.   :0.0000   Min.   :0.000     Min.   :0.0000        
+##  1st Qu.:0.000       1st Qu.:0.0000   1st Qu.:0.000     1st Qu.:0.0000        
+##  Median :0.000       Median :0.0000   Median :0.000     Median :0.0000        
+##  Mean   :0.125       Mean   :0.1875   Mean   :0.125     Mean   :0.1875        
+##  3rd Qu.:0.000       3rd Qu.:0.0000   3rd Qu.:0.000     3rd Qu.:0.0000        
+##  Max.   :1.000       Max.   :1.0000   Max.   :1.000     Max.   :1.0000        
+##                                                                               
+##   Perchlorates    Na-perchlorate    Amorphous Silicate   Phosphate     
+##  Min.   :0.0000   Min.   :0.00000   Min.   :0.0000     Min.   :0.0000  
+##  1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.0000     1st Qu.:0.0000  
+##  Median :0.0000   Median :0.00000   Median :0.0000     Median :0.0000  
+##  Mean   :0.0625   Mean   :0.03125   Mean   :0.1406     Mean   :0.2031  
+##  3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.2500     3rd Qu.:0.3125  
+##  Max.   :1.0000   Max.   :0.50000   Max.   :0.5000     Max.   :1.0000  
+##                                                                        
+##     Pyroxene         Olivine         Carbonate      Fe-Mg carbonate
+##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.000  
+##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.4375   1st Qu.:0.000  
+##  Median :1.0000   Median :0.6250   Median :1.0000   Median :0.000  
+##  Mean   :0.6875   Mean   :0.5312   Mean   :0.7344   Mean   :0.125  
+##  3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:0.000  
+##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.000  
+##                                                                    
+##  Hydrated Carbonates Disordered Silicates    Feldspar         Quartz       
+##  Min.   :0           Min.   :0.000        Min.   :0.000   Min.   :0.00000  
+##  1st Qu.:0           1st Qu.:0.000        1st Qu.:0.000   1st Qu.:0.00000  
+##  Median :0           Median :0.000        Median :0.000   Median :0.00000  
+##  Mean   :0           Mean   :0.125        Mean   :0.125   Mean   :0.03125  
+##  3rd Qu.:0           3rd Qu.:0.000        3rd Qu.:0.000   3rd Qu.:0.00000  
+##  Max.   :0           Max.   :1.000        Max.   :1.000   Max.   :0.25000  
+##                                                                            
+##     Apatite        FeTi oxides         Halite          Iron oxide    
+##  Min.   :0.0000   Min.   :0.0000   Min.   :0.00000   Min.   :0.0000  
+##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.0000  
+##  Median :0.0000   Median :0.0000   Median :0.00000   Median :0.0000  
+##  Mean   :0.1406   Mean   :0.1406   Mean   :0.04688   Mean   :0.2812  
+##  3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.5000  
+##  Max.   :1.0000   Max.   :1.0000   Max.   :0.25000   Max.   :1.0000  
+##                                                                      
+##  Hydrated Iron oxide Organic matter   Sulfate+Organic matter
+##  Min.   :0.00000     Min.   :0.0000   Min.   :0.0000        
+##  1st Qu.:0.00000     1st Qu.:0.0000   1st Qu.:0.0000        
+##  Median :0.00000     Median :1.0000   Median :0.0000        
+##  Mean   :0.01562     Mean   :0.5938   Mean   :0.2188        
+##  3rd Qu.:0.00000     3rd Qu.:1.0000   3rd Qu.:0.2500        
+##  Max.   :0.25000     Max.   :1.0000   Max.   :1.0000        
+##                                                             
+##  Other hydrated phases Phyllosilicates      Chlorite     
+##  Min.   :0.0000        Min.   :0.00000   Min.   :0.0000  
+##  1st Qu.:0.0000        1st Qu.:0.00000   1st Qu.:0.0000  
+##  Median :0.2500        Median :0.00000   Median :0.0000  
+##  Mean   :0.4375        Mean   :0.09375   Mean   :0.0625  
+##  3rd Qu.:1.0000        3rd Qu.:0.06250   3rd Qu.:0.0000  
+##  Max.   :1.0000        Max.   :0.50000   Max.   :0.5000  
+##                                                          
+##  Kaolinite (hydrous Al-clay)    Chromite        Ilmenite     Zircon/Baddeleyite
+##  Min.   :0.0000              Min.   :0.000   Min.   :0.000   Min.   :0.000     
+##  1st Qu.:0.0000              1st Qu.:0.000   1st Qu.:0.000   1st Qu.:0.000     
+##  Median :0.0000              Median :0.000   Median :0.000   Median :0.000     
+##  Mean   :0.1875              Mean   :0.125   Mean   :0.125   Mean   :0.125     
+##  3rd Qu.:0.0000              3rd Qu.:0.000   3rd Qu.:0.000   3rd Qu.:0.000     
+##  Max.   :1.0000              Max.   :1.000   Max.   :1.000   Max.   :1.000     
+##                                                                                
+##  Fe-Mg-clay minerals    Spinels           sample              name   
+##  Min.   :0.0000      Min.   :0.0000   Min.   : 1.00   Atsah     : 1  
+##  1st Qu.:0.0000      1st Qu.:0.0000   1st Qu.: 4.75   Bearwallow: 1  
+##  Median :0.0000      Median :0.0000   Median : 8.50   Coulettes : 1  
+##  Mean   :0.1875      Mean   :0.0625   Mean   : 8.50   Hahonih   : 1  
+##  3rd Qu.:0.0000      3rd Qu.:0.0000   3rd Qu.:12.25   Hazeltop  : 1  
+##  Max.   :1.0000      Max.   :0.5000   Max.   :16.00   Kukaklek  : 1  
+##                                                       (Other)   :10  
+##        SampleType         campaign         abrasion feldspar plagioclase
+##  atmospheric: 1   Crater Floor:9   Alfalfa     :2   0:14     0:13       
+##  regolith   : 0   Delta Front :7   Bellegarde  :2   1: 2     1: 3       
+##  rock core  :15   Margin Unit :0   Berry Hollow:2                       
+##                                    Dourbes     :2                       
+##                                    Novarupta   :2                       
+##                                    Quartier    :2                       
+##                                    (Other)     :4                       
+##  pyroxene olivine quartz apatite FeTi_Oxides Iron_Oxide Sulfate Perchlorates
+##  0: 5     0: 6    0:14   0:13    0:13        0:9        0: 4    0:15        
+##  1:11     1:10    1: 2   1: 3    1: 3        1:7        1:12    1: 1        
+##                                                                             
+##                                                                             
+##                                                                             
+##                                                                             
+##                                                                             
+##  Phosphate Ca_Sulfate Carbonate Fe_Mg_clay Fe_Mg_carbonate Mg_sulfate
+##  0:11      0:10       0: 1      0:13       0:14            0:13      
+##  1: 5      1: 6       1:15      1: 3       1: 2            1: 3      
+##                                                                      
+##                                                                      
+##                                                                      
+##                                                                      
+##                                                                      
+##  Phyllosilicates Chlorite Halite Organic_matter Hydrated_Ca_Sulfate
+##  0:12            0:14     0:13   0: 5           0:14               
+##  1: 4            1: 2     1: 3   1:11           1: 2               
+##                                                                    
+##                                                                    
+##                                                                    
+##                                                                    
+##                                                                    
+##  Hydrated_Sulfates Hydrated_Mg_Fe_Sulfate Na_Perchlorate Amorphous_Silicate
+##  0:14              0:13                   0:15           0:9               
+##  1: 2              1: 3                   1: 1           1:7               
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##                                                                            
+##  Hydrated_Carbonates Disordered_Silicates Hydrated_Iron_Oxide
+##  0:16                0:14                 0:15               
+##                      1: 2                 1: 1               
+##                                                              
+##                                                              
+##                                                              
+##                                                              
+##                                                              
+##  Sulfate+Organic_Matter Other_hydrated_phases Kaolinite Chromite Ilmenite
+##  0:11                   0:8                   0:13      0:14     0:14    
+##  1: 5                   1:8                   1: 3      1: 2     1: 2    
+##                                                                          
+##                                                                          
+##                                                                          
+##                                                                          
+##                                                                          
+##  Zircon/Baddeleyite Spinels     sample           Na20            Mgo        
+##  0:14               0:14    Min.   : 1.00   Min.   :1.000   Min.   : 0.730  
+##  1: 2               1: 2    1st Qu.: 4.75   1st Qu.:1.853   1st Qu.: 2.533  
+##                             Median : 8.50   Median :1.900   Median :12.800  
+##                             Mean   : 8.50   Mean   :2.672   Mean   :11.682  
+##                             3rd Qu.:12.25   3rd Qu.:4.500   3rd Qu.:19.100  
+##                             Max.   :16.00   Max.   :5.550   Max.   :22.700  
+##                                                                             
+##      Al203             Si02            P205             S03        
+##  Min.   : 1.700   Min.   :22.60   Min.   :0.1000   Min.   : 0.780  
+##  1st Qu.: 2.220   1st Qu.:31.22   1st Qu.:0.2350   1st Qu.: 1.495  
+##  Median : 3.710   Median :38.85   Median :0.5250   Median : 2.600  
+##  Mean   : 5.072   Mean   :38.55   Mean   :0.6512   Mean   : 5.562  
+##  3rd Qu.: 7.117   3rd Qu.:41.17   3rd Qu.:0.8400   3rd Qu.: 3.800  
+##  Max.   :11.600   Max.   :57.10   Max.   :2.7600   Max.   :21.530  
+##                                                                    
+##        Cl             K20              Cao             Ti02       
+##  Min.   :0.400   Min.   :0.0000   Min.   :1.500   Min.   :0.2000  
+##  1st Qu.:0.940   1st Qu.:0.1600   1st Qu.:2.655   1st Qu.:0.5900  
+##  Median :1.740   Median :0.2000   Median :3.120   Median :0.7000  
+##  Mean   :1.846   Mean   :0.5800   Mean   :3.688   Mean   :0.8194  
+##  3rd Qu.:2.080   3rd Qu.:0.8275   3rd Qu.:4.310   3rd Qu.:0.9900  
+##  Max.   :4.500   Max.   :1.9000   Max.   :7.770   Max.   :2.4900  
+##                                                                   
+##      Cr203            Mno             FeO-T               name   
+##  Min.   :0.000   Min.   :0.1000   Min.   :13.24   Atsah     : 1  
+##  1st Qu.:0.025   1st Qu.:0.2800   1st Qu.:16.71   Bearwallow: 1  
+##  Median :0.155   Median :0.4000   Median :23.86   Coulettes : 1  
+##  Mean   :0.355   Mean   :0.3812   Mean   :21.45   Hahonih   : 1  
+##  3rd Qu.:0.290   3rd Qu.:0.4900   3rd Qu.:25.70   Hazeltop  : 1  
+##  Max.   :1.900   Max.   :0.6900   Max.   :30.05   Kukaklek  : 1  
+##                                                   (Other)   :10  
+##           type           campaign    location          abrasion
+##  Igneous    :8   Crater Floor:9   01     : 1   Alfalfa     :2  
+##  N/A        :1   Delta Front :7   02     : 1   Bellegrade  :2  
+##  Sedimentary:7                    03     : 1   Berry Hollow:2  
+##                                   04     : 1   Dourbes     :2  
+##                                   05     : 1   Novarupta   :2  
+##                                   06     : 1   Quartier    :2  
+##                                   (Other):10   (Other)     :4
+
# Combine the Lithology, SHERLOC and PIXLmatrices
+sherloc_lithology_pixl.matrix<-cbind(sherloc.matrix,lithology.matrix,pixl.matrix)
+
+# Review the resulting matrix
+str(sherloc_lithology_pixl.matrix)
+
##  num [1:16, 1:83] 1 1 1 0 0 0 0 0 0 0 ...
+##  - attr(*, "dimnames")=List of 2
+##   ..$ : NULL
+##   ..$ : chr [1:83] "Plagioclase" "Sulfate" "Ca-sulfate" "Hydrated Ca-sulfate" ...
+
+
+
+

4 Analysis of Data (Part 3)

+

Each team has been assigned one of six datasets:

+
    +
  1. Dataset B: PIXL: The PIXL team’s goal is to understand and explain how scaling changes results from Assignment 1. The matrix version was scaled above but not in Assignment 1.

  2. +
  3. Dataset C: LIBS (with appropriate scaling as necessary. Not scaled yet.)

  4. +
  5. Dataset D: Sherloc (with appropriate scaling as necessary. Not scaled yet.)

  6. +
  7. Dataset E: PIXL + Sherloc (with appropriate scaling as necessary. Not scaled yet.)

  8. +
  9. Dataset F: PIXL + Lithography (with appropriate scaling as necessary. Not scaled yet.)

  10. +
  11. Dataset G: Sherloc + Lithograpy (with appropriate scaling as necessary. Not scaled yet.)

  12. +
  13. Dataset H: PIXL + Sherloc + Lithograpy (with appropriate scaling as necessary. Not scaled yet.)

  14. +
+

For the data set assigned to your team, perform the following steps. Feel free to use the methods/code from Assignment 1 as desired. Communicate with your teammates. Make sure that you are doing different variations of below analysis so that no team member does the exact same analysis. If you want to use the same clustering for your team (which is okay but then vary rest), make sure you use the same random seeds.

+
    +
  1. Describe the data set contained in the data frame and matrix: How many rows does it have and how many features? Which features are measurements and which features are metadata about the samples? (3 pts)

  2. +
  3. Scale this data appropriately (you can choose the scaling method or decide to not scale data): Explain why you chose a scaling method or to not scale. (3 pts)

  4. +
  5. Cluster the data using k-means or your favorite clustering method (like hierarchical clustering): Describe how you picked the best number of clusters. Indicate the number of points in each clusters. Coordinate with your team so you try different approaches. If you want to share results with your team mates, make sure to use the same random seeds. (6 pts)

  6. +
  7. _Perform a creative analysis that provides insights into what one or more of the clusters are and what they tell you about the MARS data: Alternatively do another creative analysis of your datasets that leads to one of more findings. Make sure to explain what your analysis and discuss your the results.

  8. +
+
+
+

5 Preparation of Team Presentation (Part 4)

+

Prepare a presentation of your teams result to present in class on September 11 starting at 9am in AE217 (20 pts) The presentation should include the following elements

+

0.Your teams names and members 1. A Description of the data set that you analyzed including how many observations and how many features. (<= 1.5 mins) 2. Each team member gets three minutes to explain their analysis: * what analysis they performed * the results of that analysis * a brief discussion of their interpretation of these results * <= 18 mins total! 3. A Conclusion slide indicating major findings of the teams (<= 1.5 mins) 4. Thoughts on potential next steps for the MARS team (<= 1.5 mins)

+ +

https://docs.google.com/document/d/1-4o1O4h2r8aMjAplmE-ItblQnyDAKZwNs5XCnmwacjs/pub

+
    +
  • Post a link to your teams presentation in the MARS webex chat before class. You can continue to edit until the last minute.
  • +
+
+
+

6 When you’re done: SAVE, COMMIT and PUSH YOUR CHANGES!

+

When you are satisfied with your edits and your notebook knits successfully, remember to push your changes to the repo using the following steps:

+
    +
  • git branch +
      +
    • To double-check that you are in your working branch
    • +
  • +
  • git add <your changed files>
  • +
  • git commit -m "Some useful comments"
  • +
  • git push origin <your branch name>
  • +
  • do a pull request
  • +
+
+
+

7 APPENDIX: Accessing RStudio Server on the IDEA Cluster

+

The IDEA Cluster provides seven compute nodes (4x 48 cores, 3x 80 cores, 1x storage server)

+
    +
  • The Cluster requires RCS credentials, enabled via registration in class +
      +
    • email John Erickson for problems erickj4@rpi.edu
    • +
  • +
  • RStudio, Jupyter, MATLAB, GPUs (on two nodes); lots of storage and computes
  • +
  • Access via RPI physical network or VPN only
  • +
+
+
+

8 More info about Rstudio on our Cluster

+
+

8.1 RStudio GUI Access:

+ +
+
+ + + + +
+ + + + + + + + + + + + + + + diff --git a/StudentNotebooks/Assignment02/changk2-assignment2-f24.pdf b/StudentNotebooks/Assignment02/changk2-assignment2-f24.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9eba64123b945b9ee807c23ac042679b5bb83b75 GIT binary patch literal 136941 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

)*I*#h!8tf~cf?#Eugqll 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 z Date: Tue, 10 Sep 2024 21:50:25 -0400 Subject: [PATCH 2/2] assignment2 PIXL dataset --- StudentNotebooks/Assignment02/changk2-assignment2-f24.Rmd | 2 +- StudentNotebooks/Assignment02/changk2-assignment2-f24.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/StudentNotebooks/Assignment02/changk2-assignment2-f24.Rmd b/StudentNotebooks/Assignment02/changk2-assignment2-f24.Rmd index c69cbdb..b030acd 100644 --- a/StudentNotebooks/Assignment02/changk2-assignment2-f24.Rmd +++ b/StudentNotebooks/Assignment02/changk2-assignment2-f24.Rmd @@ -281,7 +281,7 @@ ggbiplot::ggbiplot(pixl.matrix.pca, groups = as.factor(km$cluster)) + xlim(-2,2) + ylim(-2,2) ``` -Variable Direction and Distribution: The variables (e.g., SiO2, FeO-T, Mno, etc.) are spread out in a balanced radial pattern. The arrows representing the variables have relatively equal lengths, indicating that each feature has a balanced influence on the results. Since the data has been scaled, each variable contributes similarly in the PCA calculation, preventing certain features from dominating the clustering due to their value range. +Variable Direction and Distribution: The variables (e.g., SiO2, FeO-T, Mno, etc.) are spread out in a balanced radial pattern. The arrows representing the variables have relatively equal lengths, indicating that each feature has a balanced influence on the results. Since the data has been scaled, each variable contributes similarly in the PCA calculation, preventing certain features from dominating the clustering due to their value range.. ## Data Set C: Load the LIBS Data diff --git a/StudentNotebooks/Assignment02/changk2-assignment2-f24.html b/StudentNotebooks/Assignment02/changk2-assignment2-f24.html index c565428..9f4ac13 100644 --- a/StudentNotebooks/Assignment02/changk2-assignment2-f24.html +++ b/StudentNotebooks/Assignment02/changk2-assignment2-f24.html @@ -566,7 +566,7 @@

3.2 Data Set B: Load the PIXL Dat labels = pixl.df$type, groups = as.factor(km$cluster)) + xlim(-2,2) + ylim(-2,2) -

Variable Direction and Distribution: The variables (e.g., SiO2, FeO-T, Mno, etc.) are spread out in a balanced radial pattern. The arrows representing the variables have relatively equal lengths, indicating that each feature has a balanced influence on the results. Since the data has been scaled, each variable contributes similarly in the PCA calculation, preventing certain features from dominating the clustering due to their value range.

+

Variable Direction and Distribution: The variables (e.g., SiO2, FeO-T, Mno, etc.) are spread out in a balanced radial pattern. The arrows representing the variables have relatively equal lengths, indicating that each feature has a balanced influence on the results. Since the data has been scaled, each variable contributes similarly in the PCA calculation, preventing certain features from dominating the clustering due to their value range..

3.3 Data Set C: Load the LIBS Data