The Epoch package provides tools for downloading, manipulating, and
analyzing intracranial EEG (iEEG) epoch data. This vignette will guide
you through the main features of the package, from downloading data
using EpochDownloader
to manipulating and visualizing
Epoch
objects.
The EpochDownloader
class is your gateway to accessing
iEEG data. You can create a downloader using either a project name or a
direct OSF project ID. We provide fragility
and
kData
projects from UTMB as predefined projects for seizure
onset prediction analysis. You can list all available projects via
EpochRepos()
.
EpochRepos()
#> Configuration not fetched yet. Fetching now...
#> Attempting to update project repository configuration...
#> Success. Available projects: fragility, hup
#> $fragility
#> [1] "7rnft"
#>
#> $hup
#> [1] "4vdyu"
The EpochRepos()
function returns a list of available
projects, with name as the project name and value as the OSF project ID.
id
argument in EpochDownloader()
accept either
the project name or the OSF project ID. The default is
fragility
project if id
is not specified.
downloader <- EpochDownloader(progress=FALSE)
downloader
#> EpochDownloader object
#> - ID: 7rnft
#> - Number of files: 47
#> - Files: FragilityData_subpt2_3, FragilityData_subpt13_2, FragilityData_subpt15_1, FragilityData_subjh105_2, FragilityData_subpt12_1...(42 more)
#> Use $, [, or [[ to access the Epoch Data; Use wiki() to open the project wiki in your browser
The downloader works like a list object in R. Once you have a
downloader, you can explore what data files are available using
names()
names(downloader)
#> [1] "FragilityData_subpt2_3" "FragilityData_subpt13_2"
#> [3] "FragilityData_subpt15_1" "FragilityData_subjh105_2"
#> [5] "FragilityData_subpt12_1" "FragilityData_subjh103_1"
#> [7] "FragilityData_subpt7_2" "FragilityData_subpt11_2"
#> [9] "FragilityData_subpt13_1" "FragilityData_subpt8_2"
#> [11] "FragilityData_subpt2_2" "FragilityData_subjh103_2"
#> [13] "FragilityData_subjh105_1" "FragilityData_subpt6_3"
#> [15] "FragilityData_subpt6_2" "FragilityData_subpt8_1"
#> [17] "FragilityData_subjh101_2" "FragilityData_subjh103_3"
#> [19] "FragilityData_subpt16_1" "FragilityData_subpt01_1"
#> [21] "FragilityData_subpt01_4" "FragilityData_subpt12_2"
#> [23] "FragilityData_subpt3_1" "FragilityData_subpt10_1"
#> [25] "FragilityData_subpt11_4" "FragilityData_subpt2_1"
#> [27] "FragilityData_subpt11_3" "FragilityData_subpt11_1"
#> [29] "FragilityData_subpt14_2" "FragilityData_subpt15_2"
#> [31] "FragilityData_subpt10_3" "FragilityData_subpt3_2"
#> [33] "FragilityData_subpt01_3" "FragilityData_subjh101_1"
#> [35] "FragilityData_subjh105_3" "FragilityData_subpt10_2"
#> [37] "FragilityData_subpt15_4" "FragilityData_subpt8_3"
#> [39] "FragilityData_subpt01_2" "FragilityData_subpt6_1"
#> [41] "FragilityData_subpt15_3" "FragilityData_subpt16_3"
#> [43] "FragilityData_subjh105_4" "FragilityData_subpt14_1"
#> [45] "FragilityData_subpt16_2" "FragilityData_subpt7_3"
#> [47] "FragilityData_subpt17_2"
Now you can load specific datasets into Epoch
objects
using $
, [[]]
, or []
operators.
The downloader will automatically handle the download and conversion of
raw data files into Epoch
objects. $
and
[[]]
will return a single Epoch
object, while
[]
will return a list of Epoch
objects.
# Load the first available dataset
epoch_data <- downloader$FragilityData_subpt01_1
epoch_data
#> Epoch Object @ 1000 Hz:
#> Time -30 -29.999 -29.998 -29.997 -29.996 -29.995 -29.994
#> G1 -340001.1 -337468.1 -360006 -371602.5 -381722.9 -388522.7 -409074 ...
#> G2 -258822.7 -260679 -262803.7 -258883.7 -254481.7 -252272.8 -258038.6 ...
#> G3 -239279.3 -233117.6 -223820.4 -206524.9 -194307.3 -175271.1 -163560.5 ...
#> G4 123333.6 116130.2 121380.4 133184.7 156112.5 191592.9 235748.3 ...
#> G7 63804.24 59270.13 51457.29 36245.07 17488.84 4907.711 -14826.07 ...
#> G8 145233.7 132424.9 126525 115485.8 112664.6 106142.3 95139.39 ...
#> G9 -245320.8 -238745.9 -241513.8 -253517.7 -264246.5 -271382 -270364.3 ...
#> G10 -495154.8 -480099.8 -473566.2 -468136 -469964.3 -477490.8 -485846.7 ...
#> G13 209178.2 211959.4 214446.7 230023.3 251683.6 261378.3 274732.9 ...
#> G14 170761.3 165173.8 156977.7 156472.7 160976.6 162013.1 158694.1 ...
#> ...
#> [82 rows x 60001 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
# Load two datasets
selected_data <- c("FragilityData_subpt01_1", "FragilityData_subpt01_2")
epoch_list <- downloader[selected_data]
epoch_list
#> $FragilityData_subpt01_1
#> Epoch Object @ 1000 Hz:
#> Time -30 -29.999 -29.998 -29.997 -29.996 -29.995 -29.994
#> G1 -340001.1 -337468.1 -360006 -371602.5 -381722.9 -388522.7 -409074 ...
#> G2 -258822.7 -260679 -262803.7 -258883.7 -254481.7 -252272.8 -258038.6 ...
#> G3 -239279.3 -233117.6 -223820.4 -206524.9 -194307.3 -175271.1 -163560.5 ...
#> G4 123333.6 116130.2 121380.4 133184.7 156112.5 191592.9 235748.3 ...
#> G7 63804.24 59270.13 51457.29 36245.07 17488.84 4907.711 -14826.07 ...
#> G8 145233.7 132424.9 126525 115485.8 112664.6 106142.3 95139.39 ...
#> G9 -245320.8 -238745.9 -241513.8 -253517.7 -264246.5 -271382 -270364.3 ...
#> G10 -495154.8 -480099.8 -473566.2 -468136 -469964.3 -477490.8 -485846.7 ...
#> G13 209178.2 211959.4 214446.7 230023.3 251683.6 261378.3 274732.9 ...
#> G14 170761.3 165173.8 156977.7 156472.7 160976.6 162013.1 158694.1 ...
#> ...
#> [82 rows x 60001 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
#>
#> $FragilityData_subpt01_2
#> Epoch Object @ 1000 Hz:
#> Time -30 -29.999 -29.998 -29.997 -29.996 -29.995 -29.994
#> G1 -158993.9 -151540.2 -141476.3 -135440.9 -127395.5 -118806.2 -109545.4 ...
#> G2 -171362.2 -168750.6 -163050.2 -160952.1 -153400 -141137.8 -137052.3 ...
#> G3 -37360.11 -38600.94 -37448.78 -36063.98 -28962.79 -18697.13 -13301.15 ...
#> G4 69388.86 63649.18 62439.19 64736.42 78742.69 89872.64 106983.3 ...
#> G7 -16206.53 -20449.69 -23475.82 -22155.09 -18483.35 -15338.88 -19208.36 ...
#> G8 -147106.1 -159380.3 -176275.9 -207225.7 -239607.9 -274990.2 -307756.7 ...
#> G9 -62910.22 -60509.05 -58888.08 -62420.13 -62404.83 -62007.24 -62244.17 ...
#> G10 -62683.53 -55457.05 -55074.98 -51663.01 -45682.93 -41677.12 -38660.94 ...
#> G13 17307.58 9925.906 3648.021 -2379.253 -2385.702 -2632.314 -398.4069 ...
#> G14 108903.8 103972.4 102991 103677.1 101164.9 100707.6 99414.95 ...
#> ...
#> [82 rows x 60001 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
Once you have loaded data into Epoch
objects, you can
manipulate and analyze them.
The Epoch
object is a matrix-like structure where rows
represent electrodes and columns represent time points. The main
advantage of using Epoch
objects is that they encapsulate
both the data and row, column, and table metadata, making it easier to
work with iEEG data in R.
# Assuming we have an epoch object from previous steps
epoch <- epoch_data # or epoch_list[[1]] if you loaded multiple
print(epoch)
#> Epoch Object @ 1000 Hz:
#> Time -30 -29.999 -29.998 -29.997 -29.996 -29.995 -29.994
#> G1 -340001.1 -337468.1 -360006 -371602.5 -381722.9 -388522.7 -409074 ...
#> G2 -258822.7 -260679 -262803.7 -258883.7 -254481.7 -252272.8 -258038.6 ...
#> G3 -239279.3 -233117.6 -223820.4 -206524.9 -194307.3 -175271.1 -163560.5 ...
#> G4 123333.6 116130.2 121380.4 133184.7 156112.5 191592.9 235748.3 ...
#> G7 63804.24 59270.13 51457.29 36245.07 17488.84 4907.711 -14826.07 ...
#> G8 145233.7 132424.9 126525 115485.8 112664.6 106142.3 95139.39 ...
#> G9 -245320.8 -238745.9 -241513.8 -253517.7 -264246.5 -271382 -270364.3 ...
#> G10 -495154.8 -480099.8 -473566.2 -468136 -469964.3 -477490.8 -485846.7 ...
#> G13 209178.2 211959.4 214446.7 230023.3 251683.6 261378.3 274732.9 ...
#> G14 170761.3 165173.8 156977.7 156472.7 160976.6 162013.1 158694.1 ...
#> ...
#> [82 rows x 60001 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
You can directly visualize the Epoch
object using the
plot()
function. This will create a time series plot for
each electrode.
The Epoch
object behaves like a matrix, so you can
access its dimensions and data structure easily.
# Basic information
dim(epoch) # dimensions: electrodes x time points
#> [1] 82 60001
nrow(epoch) # number of electrodes
#> [1] 82
ncol(epoch) # number of time points
#> [1] 60001
rownames(epoch) # electrode names
#> [1] "G1" "G2" "G3" "G4" "G7" "G8" "G9" "G10" "G13" "G14"
#> [11] "G15" "G16" "G17" "G18" "G19" "G20" "G21" "G22" "G23" "G11"
#> [21] "G12" "G24" "G26" "G27" "G28" "G29" "G30" "G31" "G32" "ATT1"
#> [31] "ATT2" "ATT3" "ATT4" "ATT5" "ATT6" "ATT7" "ATT8" "PLT1" "PLT2" "PLT3"
#> [41] "PLT4" "PLT5" "PLT6" "AST1" "AST3" "AST4" "PST1" "PST2" "PST3" "PST4"
#> [51] "AD1" "AD2" "AD3" "AD4" "PD1" "PD2" "PD3" "PD4" "SF1" "SF2"
#> [61] "SF3" "SF4" "SF5" "SF6" "IF1" "IF2" "IF3" "IF4" "IF5" "IF6"
#> [71] "ILT1" "ILT2" "ILT3" "ILT4" "MLT1" "MLT2" "MLT3" "MLT4" "SLT1" "SLT2"
#> [81] "SLT3" "SLT4"
range(coltimes(epoch)) # time points range (colnames work but will return character vector)
#> [1] -30 30
# Access the underlying data
data_matrix <- tblData(epoch)
data_matrix[1:5, 1:5]
#> -30 -29.999 -29.998 -29.997 -29.996
#> G1 -340001.15 -337468.08 -360006.02 -371602.53 -381722.87
#> G2 -258822.71 -260679.02 -262803.74 -258883.72 -254481.75
#> G3 -239279.27 -233117.59 -223820.37 -206524.94 -194307.30
#> G4 123333.64 116130.15 121380.41 133184.70 156112.47
#> G7 63804.24 59270.13 51457.29 36245.07 17488.84
Epoch
objects contain metadata that provides context for
the data. You can access this metadata using rowData()
,
colData()
, and metaData()
functions.
# Access row metadata (electrode information)
electrode_info <- rowData(epoch)
print(electrode_info)
#> name soz resected
#> 1 G1 FALSE NA
#> 2 G2 FALSE NA
#> 3 G3 FALSE NA
#> 4 G4 FALSE NA
#> 5 G7 FALSE NA
#> 6 G8 FALSE NA
#> 7 G9 FALSE NA
#> 8 G10 FALSE NA
#> 9 G13 FALSE NA
#> 10 G14 FALSE NA
#> 11 G15 FALSE NA
#> 12 G16 FALSE NA
#> 13 G17 FALSE NA
#> 14 G18 FALSE NA
#> 15 G19 FALSE NA
#> 16 G20 FALSE NA
#> 17 G21 FALSE NA
#> 18 G22 FALSE NA
#> 19 G23 FALSE NA
#> 20 G11 FALSE NA
#> 21 G12 FALSE NA
#> 22 G24 FALSE NA
#> 23 G26 FALSE NA
#> 24 G27 FALSE NA
#> 25 G28 FALSE NA
#> 26 G29 FALSE NA
#> 27 G30 FALSE NA
#> 28 G31 FALSE NA
#> 29 G32 FALSE NA
#> 30 ATT1 TRUE TRUE
#> 31 ATT2 TRUE TRUE
#> 32 ATT3 FALSE NA
#> 33 ATT4 FALSE NA
#> 34 ATT5 FALSE NA
#> 35 ATT6 FALSE NA
#> 36 ATT7 FALSE NA
#> 37 ATT8 FALSE NA
#> 38 PLT1 FALSE NA
#> 39 PLT2 FALSE NA
#> 40 PLT3 FALSE NA
#> 41 PLT4 FALSE NA
#> 42 PLT5 FALSE NA
#> 43 PLT6 FALSE NA
#> 44 AST1 FALSE NA
#> 45 AST3 FALSE NA
#> 46 AST4 FALSE NA
#> 47 PST1 FALSE NA
#> 48 PST2 FALSE NA
#> 49 PST3 FALSE NA
#> 50 PST4 FALSE NA
#> 51 AD1 TRUE TRUE
#> 52 AD2 TRUE TRUE
#> 53 AD3 TRUE TRUE
#> 54 AD4 TRUE TRUE
#> 55 PD1 TRUE TRUE
#> 56 PD2 TRUE TRUE
#> 57 PD3 TRUE TRUE
#> 58 PD4 TRUE TRUE
#> 59 SF1 FALSE NA
#> 60 SF2 FALSE NA
#> 61 SF3 FALSE NA
#> 62 SF4 FALSE NA
#> 63 SF5 FALSE NA
#> 64 SF6 FALSE NA
#> 65 IF1 FALSE NA
#> 66 IF2 FALSE NA
#> 67 IF3 FALSE NA
#> 68 IF4 FALSE NA
#> 69 IF5 FALSE NA
#> 70 IF6 FALSE NA
#> 71 ILT1 FALSE NA
#> 72 ILT2 FALSE NA
#> 73 ILT3 FALSE NA
#> 74 ILT4 FALSE NA
#> 75 MLT1 FALSE NA
#> 76 MLT2 FALSE NA
#> 77 MLT3 FALSE NA
#> 78 MLT4 FALSE NA
#> 79 SLT1 FALSE NA
#> 80 SLT2 FALSE NA
#> 81 SLT3 FALSE NA
#> 82 SLT4 FALSE NA
# Access column metadata (there is no column metadata in this example)
time_info <- colData(epoch)
print(time_info)
#> data frame with 0 columns and 0 rows
# Access general metadata
meta_info <- metaData(epoch)
str(meta_info)
#> List of 14
#> $ patient : chr "subpt01"
#> $ type : chr "ecog"
#> $ timeWindow : num [1:2] -30 30
#> $ seizureTime : int 0
#> $ totalRuns : int 4
#> $ run : int 1
#> $ source : chr "National Institute of Health"
#> $ gender : chr "F"
#> $ outcome : chr "S"
#> $ ageOnsetEpilepsy : num 13
#> $ ageIEEGSurgeryEvaluation: num 30
#> $ imagingOutcome : chr "large area of encephalomalacia in R parietal region. Smaller areas in R and L posterior temporal regions. Possi"| __truncated__
#> $ brainRegion : chr "right anterior Temporal Lobe"
#> $ samplingRate : num 1000
You can subset Epoch
objects to focus on specific
electrodes or time points.
You can use the electrode indices to select the first 3 electrodes
epoch[1:3, ]
#> Epoch Object @ 1000 Hz:
#> Time -30 -29.999 -29.998 -29.997 -29.996 -29.995 -29.994
#> G1 -340001.1 -337468.1 -360006 -371602.5 -381722.9 -388522.7 -409074 ...
#> G2 -258822.7 -260679 -262803.7 -258883.7 -254481.7 -252272.8 -258038.6 ...
#> G3 -239279.3 -233117.6 -223820.4 -206524.9 -194307.3 -175271.1 -163560.5 ...
#> [3 rows x 60001 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
Alternatively, you can select by names
electrode_names <- rownames(epoch)[1:3]
epoch[electrode_names, ]
#> Epoch Object @ 1000 Hz:
#> Time -30 -29.999 -29.998 -29.997 -29.996 -29.995 -29.994
#> G1 -340001.1 -337468.1 -360006 -371602.5 -381722.9 -388522.7 -409074 ...
#> G2 -258822.7 -260679 -262803.7 -258883.7 -254481.7 -252272.8 -258038.6 ...
#> G3 -239279.3 -233117.6 -223820.4 -206524.9 -194307.3 -175271.1 -163560.5 ...
#> [3 rows x 60001 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
You can also select electrode using a list-like syntax
epoch[electrode_names]
#> Epoch Object @ 1000 Hz:
#> Time -30 -29.999 -29.998 -29.997 -29.996 -29.995 -29.994
#> G1 -340001.1 -337468.1 -360006 -371602.5 -381722.9 -388522.7 -409074 ...
#> G2 -258822.7 -260679 -262803.7 -258883.7 -254481.7 -252272.8 -258038.6 ...
#> G3 -239279.3 -233117.6 -223820.4 -206524.9 -194307.3 -175271.1 -163560.5 ...
#> [3 rows x 60001 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
You can directly subset the Epoch
object by time
indices
epoch[, 1:100]
#> Epoch Object @ 1000 Hz:
#> Time -30 -29.999 -29.998 -29.997 -29.996 -29.995 -29.994
#> G1 -340001.1 -337468.1 -360006 -371602.5 -381722.9 -388522.7 -409074 ...
#> G2 -258822.7 -260679 -262803.7 -258883.7 -254481.7 -252272.8 -258038.6 ...
#> G3 -239279.3 -233117.6 -223820.4 -206524.9 -194307.3 -175271.1 -163560.5 ...
#> G4 123333.6 116130.2 121380.4 133184.7 156112.5 191592.9 235748.3 ...
#> G7 63804.24 59270.13 51457.29 36245.07 17488.84 4907.711 -14826.07 ...
#> G8 145233.7 132424.9 126525 115485.8 112664.6 106142.3 95139.39 ...
#> G9 -245320.8 -238745.9 -241513.8 -253517.7 -264246.5 -271382 -270364.3 ...
#> G10 -495154.8 -480099.8 -473566.2 -468136 -469964.3 -477490.8 -485846.7 ...
#> G13 209178.2 211959.4 214446.7 230023.3 251683.6 261378.3 274732.9 ...
#> G14 170761.3 165173.8 156977.7 156472.7 160976.6 162013.1 158694.1 ...
#> ...
#> [82 rows x 100 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
However, it makes more sense to use the time range to subset the
data. The crop()
function allows you to specify a time
range (in seconds) for subsetting.
crop(epoch, start = -0.5, end = 1.5)
#> Epoch Object @ 1000 Hz:
#> Time -0.5 -0.498999999999999 -0.498000000000001 -0.497
#> G1 83954.39 59546.33 44764.14 31189.57 ...
#> G2 -28588.45 -41974.43 -59346.05 -75809.69 ...
#> G3 -96285.21 -120252.2 -146442.6 -163227.7 ...
#> G4 277691.1 276645.3 277634.8 281508.1 ...
#> G7 315594 309808.2 300873.7 295004.9 ...
#> G8 -3719.599 -9663.695 -4609.956 9302.672 ...
#> G9 399654.2 386058.4 377563 360932.4 ...
#> G10 -297223.6 -301171.7 -308872.8 -321010.8 ...
#> G13 295319.7 298589.5 287789.2 276180.2 ...
#> G14 65477.85 75985.03 78890.52 78240.9 ...
#> ...
#> [82 rows x 2001 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
You can resample the Epoch
data to a different sampling
rate using the resample()
function. This is useful for
aligning data from different sources or for reducing the data size.
# Resample to 250 Hz
resampled_epoch <- resample(epoch, samplingRate = 250)
resampled_epoch
#> Epoch Object @ 250 Hz:
#> Time -30 -29.996 -29.992 -29.988 -29.984 -29.98 -29.976
#> G1 -213493.7 -408975.1 -406128.5 -404590.5 -304470 -323483.3 -364072.2 ...
#> G2 -164481.4 -276574.4 -255103 -281570.6 -279688.2 -301354.3 -291143.6 ...
#> G3 -147177.3 -215020.5 -119157.4 -123371.6 -144599.9 -164542.8 -134119.8 ...
#> G4 70840.24 171845.6 288311.4 268776.9 219197.4 261427.1 242933.4 ...
#> G7 38998.86 26569.08 -45037.71 -51607.56 -43814.7 -31480.69 -29668.55 ...
#> G8 84885.77 124950.2 65739.51 62205.83 105809.8 116641.2 140484.2 ...
#> G9 -150185 -279959.7 -256077.4 -280970.9 -248434.4 -250663.5 -255166.7 ...
#> G10 -301509.1 -514761.7 -467354.4 -526367.4 -541768.5 -557865.2 -514886.9 ...
#> G13 130925.5 261850 299685.2 303672.4 304916 243986.2 169565.3 ...
#> G14 103164.1 172761.7 160109 191937 193404 212082.2 182076.7 ...
#> ...
#> [82 rows x 15001 cols]
#> rowData: [3 vars] name, soz, resected
#> metaData: [14 vars] patient, type, timeWindow, seizureTime, totalRuns, run, ...
#> Use tblData, rowData, colData, metaData to get the data
You can also create your own Epoch
objects from scratch.
We first define the table data.
# Create sample iEEG-like data
n_electrodes <- 10
n_timepoints <- 1000
sampling_rate <- 500 # Hz
start_time <- -0.5 # seconds
# Generate synthetic data
synthetic_data <- matrix(
rnorm(n_electrodes * n_timepoints),
nrow = n_electrodes,
ncol = n_timepoints
)
# Create electrode names
electrode_names <- paste0("Electrode_", sprintf("%02d", 1:n_electrodes))
To give more context to the data, we can define its row, column, and general metadata.
# Create electrode metadata
electrode_metadata <- data.frame(
electrode_id = electrode_names,
brain_region = rep(c("Frontal", "Temporal", "Parietal"), length.out = n_electrodes),
hemisphere = rep(c("Left", "Right"), length.out = n_electrodes),
depth = runif(n_electrodes, 10, 50), # depth in mm
stringsAsFactors = FALSE
)
# Create time metadata
time_points <- seq(start_time, by = 1/sampling_rate, length.out = n_timepoints)
time_metadata <- data.frame(
epoch_phase = ifelse(time_points < 0, "pre_stimulus", "post_stimulus"),
stringsAsFactors = FALSE
)
# Create general metadata
general_metadata <- list(
subject_id = "SUB001",
session = "Session1",
task = "Memory Task",
sampling_rate = sampling_rate,
recording_date = Sys.Date()
)
Lastly, we can create the Epoch
object using the
Epoch()
constructor.
comprehensive_epoch <- Epoch(
table = synthetic_data,
electrodes = electrode_names,
startTime = start_time,
samplingRate = sampling_rate,
rowData = electrode_metadata,
colData = time_metadata,
metaData = general_metadata
)
comprehensive_epoch
#> Epoch Object @ 500 Hz:
#> Time -0.5 -0.498 -0.496 -0.494 -0.492
#> Electrode_01 -0.3765179 0.9268902 -0.8770737 0.3725879 0.5485065 ...
#> Electrode_02 1.708045 -1.324346 1.16924 1.772467 -2.468882 ...
#> Electrode_03 2.298384 0.0495917 -1.866166 -0.3779017 0.6610664 ...
#> Electrode_04 0.1338116 -0.9668936 -0.7133487 -1.487074 0.05156054 ...
#> Electrode_05 1.104871 0.613099 -0.4526392 -1.069878 0.1620363 ...
#> Electrode_06 -0.7214923 -1.883652 0.06664331 1.427896 0.3593585 ...
#> Electrode_07 -0.339718 -0.1435527 -0.9702266 -0.3509157 -0.8526627 ...
#> Electrode_08 -1.003278 0.2633321 0.1118289 0.7544684 -1.617216 ...
#> Electrode_09 -1.065355 -1.90615 -0.9683964 -0.8717292 -1.323681 ...
#> Electrode_10 -1.198887 1.218231 0.7890107 0.7542445 0.7856528 ...
#> [10 rows x 1000 cols]
#> rowData: [4 vars] electrode_id, brain_region, hemisphere, depth
#> colData: [1 var] epoch_phase
#> metaData: [6 vars] subject_id, session, task, sampling_rate, recording_date
#> Use tblData, rowData, colData, metaData to get the data