Skip to content
ggerp: Visualizing Event-Related Potentials with ggplot2
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
R
README_figs
data
man
.DS_Store
.Rbuildignore
.gitignore
DESCRIPTION
NAMESPACE
README.Rmd
README.html
README.md
ggerp.Rproj

README.md

ggerp: Visualization of Event-Related Brain Potentials with ggplot2

ggerp considers event-related brain potential (ERP) data analysis in a standard linear model setting and implements a set of functions in R to facilitate visual exploration of data and display of statistical testing results.

These R functions are based on ggplot2 package to enable step-by-step revision of graphic objects. We also adopts significant testing procedure provided by ERP package.

Beyond rendering conditioning plots of ERPs on the scalp map, with these functions in ggerp users can create animation for displaying significant effects across electrode locations over time by using gganimate package.

The ggerp can be installed using devtools:

install_github("PsyChiLin/ggerp")

Packages Preparation

The following R command lines illustrate the exploration of ERP data using advanced graphical tool ggerp available in R.

Load (and install) packages.

library(pacman)
pacman::p_load(ERP, mnormt, fdrtool, tidyverse, gridExtra, crayon,
               boot, reshape2, ggthemes, devtools)

Install ImageMagick within R. Please check all boxes.

#install.ImageMagick()

Install and load gganimate and animation from github.

#install_github("yihui/animation")
#install_github("dgrtwo/gganimate")
library(animation)
library(gganimate)

Load ggerp.

library(ggerp)

Data Preparation We demonstrate the graphical capabilities of ggerp with these real data set DirectedForgetting. Download data DirectedForgetting from this website or directly use the build-in one. It contains variables named TBR_score and TBF_score (continuous), Condition (categorical), and one variable per time point (ERP values, i.e, T_1200). The scope of possible linear modeling designs is therefore quite large. The command lines shall be marginally adpated to your own ERP dataset. Note that Condition, which is a with-subject variable, could also be changed to a between subject variable Group in your own dataset.

# dta <- read.csv("DirectedForgetting.csv")
dta <- DirectedForgetting

The sequence of time points is generated, called time_pt.

time_pt <- seq(-200, 1000, 1)

Specify channels in the data file erpR_coord according to their scalp locations.

erpR_coord <- rbind(c(NA, "FP1", NA, "FP2", NA),
                    c("F7", "F3", "FZ", "F4", "F8"),
                    c("FT7", "FC3", "FCZ", "FC4", "FT8"),
                    c("T7", "C3", "CZ", "C4", "T8"),
                    c("TP7", "CP3", "CPZ", "CP4", "TP8"),
                    c("P7", "P3", "PZ", "P4", "P8"),
                    c(NA, "O1", "OZ", "O2", NA))

Average ERP curves for conditions on the 10/10 system

Fig01 <- plot_tete(data = dta,
                   frames = time_pt,
                   channel = 5,
                   subject = 1,
                   uV = 6:1206,
                   test = 4,
                   mode = "mean",
                   scalp = TRUE,
                   curve.col = c("chartreuse4","firebrick"),
                   coord.mat = erpR_coord,
                   ylim = c(-5, 10))

Individual ERP curves by condition from four channels.

First, restrict the data to four channels

dta_c <- filter(dta,Channel %in% c("FZ", "FCZ", "CZ", "PZ")) %>%
        droplevels()

Then, create the plot.

Fig02 <- plot_tete(data = dta_c,
                   frames = time_pt,
                   channel = 5,
                   subject = 1,
                   uV = 6:1206,
                   test = 4,
                   mode = "raw",
                   ylim = c(-25, 25))

Confidence intervals for mean ERP curves on CZ.

First restrict the data to channel CZ.

dta_c <- filter(dta, Channel == "CZ" ) %>%
        droplevels()

Seed random number generator for replication

set.seed(123)

Then, create the plot in two stages.

Fig03 <- plot_tete(data = dta_c,
                   frames = time_pt,
                   channel = 5,
                   subject = 1,
                   uV = 6:1206,
                   test = 4,
                   mode = "bootci",
                   ylim = c(-7, 10))+
        theme(legend.position = c(.9, .9))

Results of significant testing comparing conditions for three channels

First restrict the data to three channels.

dta_c <- dta %>%
        filter(Channel %in% c("FZ","CZ","PZ")) %>%
        droplevels()

Then, create the plot.

Fig04 <- plot_fa(data = dta_c,
                 frames = time_pt,
                 channel = 5,
                 subject = 1,
                 uV = 6:1206,
                 test = 4,
                 mode = "test_signal",
                 design = (~Subject + Condition),
                 design0 = (~Subject),
                 nbf = 5,
                 ylim = c(-6, 7.5))

Significant changes across channels over time on the scalp

First, save test results.

test_res <- plot_fa(data = dta,
                    frames = time_pt,
                    channel = 5,
                    subject = 1,
                    uV = 6:1206,
                    test = 4,
                    mode = "test_signal",
                    design = (~Subject + Condition),
                    design0 = (~Subject),
                    nbf = 5,
                    ylim = c(-6, 13))

Then, create GIF file for animation. The example Gif file could be download on this website.

Fig05 <- plot_coord(tests_rst = test_res$Test_Rst,
                    frames = time_pt,
                    show = seq(200, 500, by = 1),
                    loop = 1,
                    interval = 0.1, 
                    filename = "Fig05.gif")

Associations between ERPs and a numerical covariate

First restrict the data to three channels.

dta_c <- dta %>%
        filter(Condition == "TBF", Channel %in% c("FZ","CZ","PZ")) %>%
        droplevels()

Produce each plot respectively.

Fig06a <- plot_tete(data = dta_c,
                    frames = time_pt,
                    channel = 5,
                    subject = 1,
                    uV = 6:1206,
                    test = 3,
                    mode = "raw",
                    ylim = c(-25, 28))
Fig06a <- Fig06a + 
                theme(legend.position = "top", legend.box = "horizontal")
Fig06b <- plot_tete(data = dta_c,
                    frames = time_pt,
                    channel = 5,
                    subject = 1,
                    uV = 6:1206,
                    test = 3,
                    mode = "bootci",
                    ylim = c(-1, 1),
                    labs = list(y = "Correlation", x = "Time (ms)"))
Fig06c <- plot_fa(data = dta_c,
                  frames = time_pt,
                  channel = 5,
                  subject = 1,
                  uV = 6:1206,
                  test = 3,
                  mode = "test",
                  design = (~TBF_score),
                  nbf = 5,
                  ylim=c(-1, 1),
                  labs = list(y = "Correlation", x = "Time (ms)"))

Combine the plots to a final figure.

grid.arrange(Fig06a +
                     ggtitle("A") +
                     theme(plot.title = element_text(hjust = 0)),
             Fig06b +
                     ggtitle("B") +
                     theme(plot.title = element_text(hjust = 0)),
             Fig06c$Plot +
                     ggtitle("C") +
                     theme(plot.title = element_text(hjust = 0)))

You can’t perform that action at this time.