For importing and working with fNIRS data from COBI Studio in R.
Current features
- Importing fNIRS data from COBI Studio (.nir) into a data frame
- Adding markers to the data frame from the COBI Studio markers file (.mrk)
- Creating a summary report of signal quality (weak and saturated channels)
- Removing the ambient light signal from the data file
- Removing selected channels from the data file (e.g., channels with poor signal quality)
- Creating delta OD (change in optical density) values from the raw light intensity data
Planned features (in progress)
- Converting delta OD values to HbO and HbR values (i.e., oxy data) using the modified Beer-Lambert (MBLL) law
- Adding Brodmann areas to the data frame based on the channel locations
- Plotting the data (x = time, y = HbO/HbR values) for each channel
- Plotting the data (showing activation in the brain areas)
- Filtering the data using a low-pass filter
- Applying a SMAR (i.e., sliding window motion artifact rejection) filter to the data
Installation
You can install the development version of cobifnirs from GitHub
# install.packages("devtools")
devtools::install_github("christopherjwilson/cobifnirs")
Importing .nir files into R
library(cobifnirs)
library(dplyr)
# Import a single .nir file
nirData <- import_nirs("path/to/your/data.nir")
# Import multiple .nir files
# path should be the folder where the file is, ending in /
myPath <- "C:.../fnirs_data/"
#list all of the nirs files in a directory
nirsFiles <- list.files(pattern = ".nir$", recursive = TRUE, path = myPath)
# import all of the nirs files
nirsData <- lapply(nirsFiles, import_nirs, folder = myPath)
# base the number of participants on the number of files in the directory
# this is useful for later analysis
nparticipants <- length(nirsFiles)
# add a participant id as the name of each dataframe in the data list
names(nirsData) <- c(paste("p",pids, sep = ""))
# add the participant id column to each of the dataframes in the data list,
# so we can identify each dataset if they are combined later
nirsData <- mapply(`[<-`, nirsData, 'npid', value = pids, SIMPLIFY = FALSE)
Adding the markers to the data
Important: the markers file must be in the same folder as the .nir file and have the same name.
See the function documentation for more details on how to use this function (re: duplicate markers).
# add markers to a single dataset
nirsData <- add_markers(nirsData)
# add markers to multiple datasets
nirsData <- lapply(nirsData, add_markers)
Creating a summary report of signal quality
# create a summary report of signal quality for a single dataset
signalSummary <- signal_summary(nirData)
# create a summary report of signal quality for multiple datasets and write to a file
signalSummary <- lapply(nirsData, signal_summary, min=1000, max = 4000)
signalSummary <- bind_rows(signalSummary, .id = "PID")
problem_channels <- signalSummary %>% filter(min_max_signal_status != "ok" || mean_signal_status != "ok")
write.csv(problem_channels, "problem_channels.csv")
Removing problem channels
# remove selected channels from a single dataset
nirsData <- remove_channels(nirsData, channels = c(1, 2, 3))
# remove selected channels from multiple datasets
## List of problem channels for removal
problem_channels_r <- read_csv(paste0(myPath, "/problem_channels.csv"))
problem_channels_r$remove <- if_else(is.na(problem_channels_r$remove), 0, 1)
problem_channels_r$remove <- as.logical(problem_channels_r$remove)
problem_channels_r <- problem_channels_r %>% filter(problem_channels_r$remove == TRUE)
## remove the channels (after visual inspection too!)
nirsData <- lapply(nirsData, removeChannels, problem_channels_r)