An ELISA generated colour that is read using a 96 well plate spectrophotometer that measures absorbance at a specific wavelength.
This script illustrates working with 96 well plate data, working with a standard curve and calculating unknowns.
--- START ---
library(readxl)
library(ggplot2)
library(dplyr)
# import data from Excel file no Github
# this comes straight from the spectrophotometer
link <- "https://github.com/brennanpincardiff/RforBiochemists/raw/master/data/hCG_absorbances.xlsx"
download.file(url=link, destfile="hCG_absorbances.xlsx", mode="wb")
hcg_file <- read_xlsx("hCG_absorbances.xlsx")
wavelength <- hcg_file[17,2]
days <- hcg_file[5,2]
# Excel stores the number of days since Jan-0-1900
# https://stackoverflow.com/questions/25158969/read-xlsx-reading-dates-wrong-if-non-date-in-column
# adding days to a date:
# https://stackoverflow.com/questions/10322035/r-adding-days-to-a-date
date <- as.Date("1900-01-01") + as.numeric(days) - 2
a
# this allows us a first look at the file...
# there is lots of metadata at the top which we don't need right now..
# we can skip at least the first 23 rows
abs_data <- read_xlsx("hCG_absorbances.xlsx", skip = 23)
# standard curve values are:
hcg <- c(5, 50, 200, 500, 1000, 5, 50, 200, 500, 1000)
# these correspond to A to E in columns 1 and 2
# we can pull these out with subsetting [rows, colums]
abs_data[1:5,2] # gives first set of standards
# using c() and unlist() will turn these into a vector
abs_std <- c(unlist(abs_data[1:5,2]), unlist(abs_data[1:5,3]))
# plot the data
plot(abs_std~hcg)
# create the dataframe
stand_curve <- data.frame(hcg, abs_std)
# draw the graph...
ggplot(stand_curve, aes(x = hcg, y = abs_std))+
geom_point() +
geom_smooth()
# line begins to top out at high absorbance - assay limitation
# plot and make the linear plot with just the first three values
# where hcg is less than 250
# here is the data...
stand_curve %>%
filter(hcg<250) %>%
ggplot(aes(x = hcg, y = abs_std)) +
geom_point() +
stat_smooth(method = "lm", formula = y~x) +
xlab("hCG") +
ylab(paste("Absorbance", as.character(wavelength))) +
ggtitle(paste("hCG Standard Curve \n", date))
stand_curve <- filter(stand_curve, hcg<250)
line <- lm(stand_curve$abs_std ~ stand_curve$hcg)
# extract intercept and slope from our line object
int <- line$coefficients[1]
slope <- line$coefficients[2]
# now calculate the unknowns
# R will calculate the whole data frame for us
# and put it into another data frame.
# abs_data[,2:11] - subsets the numbers we want.
# round() reduces the number of decimal points.
hCG_Ukns <- round((abs_data[,2:11] - int)/slope, 1)
hCG_Ukns
# some of the unknowns are below the lowest standard but hey...
--- END ---
Resources
No comments:
Post a Comment
Comments and suggestions are welcome.