Skip to main content
Social Sci LibreTexts

8.10: Exercise- Detecting Eye Movements

  • Page ID
    137782
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    By this point, I hope you have a good idea of how to detect and reject blinks. In this exercise, we’ll look at another common artifact, saccadic eye movements. Depending on the nature of the experiment, saccadic eye movements can be an enormous problem or largely irrelevant. How can you tell? The answer, as always, is to think about the three problems that artifact rejection is designed to solve. Because the MMN experiment uses auditory stimuli, changes in eye position won’t directly impact the sensory input. And because participants were watching a silent movie at fixation during the experiment, there is no reason to suspect that the eyes will move in different directions for deviant versus standard trials (although this is something that we should verify rather than assume). If the eye movements have a random direction, then they will cancel out (because the polarity reverses for opposite directions) and are unlikely to be a confound. So, the main question is whether the eye movements add significant noise and decrease our statistical power. We can use the SME values to determine whether rejecting trials with eye movements helps us (because it reduces a source of noise) or hurts us (because it reduces the number of trials).

    Subject #1 in the MMN experiment made no obvious eye movements while doing the task, so we’re going to look at Subject #10 for this exercise. At this point, I’d recommend quitting and restarting EEGLAB. You can then load the dataset named 10_MMN_preprocessed.set. Take a quick look to familiarize yourself with this participant’s EEG. Ordinarily, you’d look carefully and think about whether to interpolate any channels, but here we’ll just focus on the eye movements.

    To make the eye movements easier to visualize, we’re going to start by applying a low-pass filter to minimize high-frequency noise. Selected EEGLAB > ERPLAB > Filter & Frequency Tools > Filters for EEG data and apply a low-pass filter with a 30 Hz half-amplitude cutoff and a slope of 12 dB/octave. Save the resulting dataset as 10_MMN_preprocessed_filt. Then epoch the data with EEGLAB > ERPLAB > Extract bin-based epochs, using a time range of -200 800 ms and Pre as the baseline. Save the resulting dataset as 10_MMN_preprocessed_filt_be. Now we’re ready to look at the eye movements.

    Why We’re Filtering Now

    Earlier, I said that filtering out high-frequency noise isn’t necessary for the step function. So, why am I asking you to filter the data here? The answer is simple: At this point, I want you to learn what eye movements look like, and the filtering will help with that. The filtering will have virtually no impact on the operation of the step function algorithm.

    Unless the participant is tracking moving objects or is walking around, most of the eye movements you’ll see will be saccades (sudden shifts in gaze position). Saccades produce a sudden change from one voltage level to another in the EOG electrodes. Plot the EEG data and go to Epoch 7. It should look something like Screenshot 8.4. To see the eye movements more clearly, I’ve selected Settings > Number of channels to display in the plotting window and entered 6 as the number of channels, and I’ve told it to display only one epoch at a time with Settings > Time range to display.

    Screenshot 8.4

    4 Saccade_Example_Subject10_Epoch7.png

    You can see a classic saccadic eye movement pattern at 400 ms in Epoch 7. The voltage is fairly flat for a few hundred milliseconds, and then there is a sudden shift in the EOG channels, followed by a relatively flat signal at a different voltage level until a blink occurs near the end of the epoch. This is because in a saccadic eye movement, gaze is fixed at one location for a period of time, then moves rapidly, and then remains fixed at a new location for a period of time.  At ~400 ms, the voltage goes more positive at HEOG-right and more negative at HEOG-left, indicating a rightward eye movement. But the voltage simultaneously shifts in the positive direction at VEOG-lower, meaning that the eye movement is actually angled downward as well.

    This participant has a fairly large number of blinks, and we should deal with those before we assess the effects of the eye movements. To flag the blinks, select EEGLAB > ERPLAB > Artifact detection in epoched data > Step-like artifacts and set the window width to 200 ms, the window step to 10 ms, the threshold to 50 µV, and the channel to 33. Also, click the 2 button in the Mark Flag section (this will be explained a little later). Click ACCEPT to run the routine. If you scroll through the data, you’ll see that the algorithm did a good job of flagging epochs with clear blinks. Save the dataset, naming it 10_MMN_preprocessed_filt_be_noblinks.

    Now we’re going to flag trials with horizontal eye movements. In some tasks, the stimuli are presented to the left or right of fixation, so most of the eye movements are horizontal. In the MMN task, participants watched a silent movie, so the eye movements might be in any direction. Consequently, we would ordinarily want to detect both horizontal and vertical eye movements in this task. However, it will be easier to understand what’s going on in this exercise if we just look for horizontal eye movements.

    To flag the horizontal eye movements, start with the dataset you just created (10_MMN_preprocessed_filt_be_noblinks) and select EEGLAB > ERPLAB > Artifact detection in epoched data > Step-like artifacts. Keep the window width at 200 ms and the window step at 10 ms, but change the channel to 32 (HEOG-bipolar). You should also lower the threshold to 32 µV. I like to use multiples of 16 µV for horizontal eye movements because, for the average participant, each degree of eye rotation increases the HEOG voltage by 16 µV (Lins et al., 1993). A threshold of 32 should therefore detect eye movements of approximately 2° or larger.

    You should also click the 3 button in the Mark Flag section. These flags are used to keep track of different types of artifacts. Flag 1 is always set for any artifact, but you can add other flags. When you detected blinks, you told it to set Flag 2. Here we’re going to set Flag 3 for horizontal eye movements. This will allow us to get a separate count of the number of blinks and the number of horizontal eye movements.

    Click ACCEPT to run the routine. Before you scroll through the EEG, take a look at the summary of artifacts in the Matlab command window, which should look something like this:

    Bin   #(%) accepted   #(%) rejected    # F2    # F3    # F4    # F5    # F6    # F7    # F8
      1     118( 59.0)       82( 41.0)      64      66       0       0       0       0       0
      2     341( 58.4)      243( 41.6)     185     211       0       0       0       0       0
    ___________________________________________________________________________________________
    Total   459( 58.5)      325( 41.5)     249     277       0       0       0       0       0

    When we previously detected trials with blinks, 31.8% of epochs were flagged for rejection (collapsed across bins). That has now increased to 41.5% (270 epochs). The column labeled #F2 shows the number of epochs with Flag 2 set (blinks), and the column labeled #F3 shows the number of epochs with Flag 3 set (horizontal eye movements). In Bin 1, for example, 82 epochs were flagged for rejection overall, with 64 epochs with Flag 2 and 66 epochs with Flag 3. Of course, 64 + 66 is not equal to 82, because some trials were flagged for both blinks and eye movements. There were 18 trials flagged for eye movements that weren’t flagged for blinks (because 82 total rejected epochs – 64 epochs flagged for blinks = 18 epochs flagged only for eye movements).

    Too Many Blinks?

    As described earlier, my lab excludes any participants with >25% rejected trials in our basic science experiments, so you might expect that this participant would have been excluded. However, we used artifact correction to deal with blinks in the analyses reported in the ERP CORE paper (Kappenman et al., 2021), so we did not need to exclude this participant.

    Now take a look at the EEG and EOG data. (I recommend telling the plotting tool to display only 6 channels so that you can focus on the EOG data.) You’ll see that the very first epoch was flagged for both blinks and eye movements (because both the VEOG-bipolar and HEOG-bipolar waveforms are drawn in red in Epoch 1). The HEOG signal is clearly not an eye movement—it doesn’t show the sudden step from one voltage level to another voltage level that is produced by a saccadic eye movement. Instead, the blink that you can see in the VOEG-bipolar channel has “leaked” into the HEOG-bipolar channel (see the region marked with the red oval in Screenshot 8.5). In an ideal world, a blink would produce equal activity to the sides of the two eyes, and the HEOG-left minus HEOG-right subtraction would therefore eliminate the blink in the HEOG-bipolar channel. However, if one HEOG electrode was placed a little higher or lower than the other, the blink activity won’t be identical at the left and right sites, and the subtraction won’t completely eliminate the blink activity. This is one reason why a large number of epochs were flagged for both blinks and eye movements.

    Screenshot 8.5

    5 Leakage.png

    In Epoch 6, you’ll see a clear eye movement (a step-like voltage change) in the HEOG-bipolar channel, which was correctly flagged. The eye movement must have been diagonal, because it also created a step-like deflection at the same time in the VEOG-bipolar channel. Only the HEOG-bipolar channel is drawn in red, however, because we applied the threshold of 32 µV only to the HEOG-bipolar channel, and the deflection in the VEOG-bipolar channel was not big enough to be detected when we looked for blinks with a threshold of 50 µV.

    If you scroll through the whole dataset, you’ll see that many horizontal eye movements were successfully flagged, but others were missed (e.g., Epochs 3, 67, 190, 389). Let’s reduce the threshold and see whether we can detect those artifacts. First, save the current dataset, naming it 10_MMN_preprocessed_filt_be_noblinks_HEOG32. You’ll need it for the next exercise.

    Now repeat the artifact detection process, keeping 10_MMN_preprocessed_filt_be_noblinks_HEOG32 as the active dataset so that we can add to the previous detections. When you launch Artifact detection in epoched data > Step-like artifacts, reduce the threshold to 16 and select the 4 button instead of the 3 button in the Mark Flag section. Click ACCEPT to run the routine, and then take a look at the summary of artifacts in the Matlab command window, which should look something like this:

    Bin   #(%) accepted   #(%) rejected    # F2    # F3    # F4    # F5    # F6    # F7    # F8
      1      71( 35.5)      129( 64.5)      64      66     128       0       0       0       0
      2     183( 31.3)      401( 68.7)     185     211     394       0       0       0       0
    ___________________________________________________________________________________________
    Total   254( 32.4)      530( 67.6)     249     277     522       0       0       0       0

    You can see that we’ve now rejected a lot more trials than before (67.6% of the total). The #F3 column shows how many trials were flagged with the previous threshold of 32 µV, and the #F4 column shows how many trials were flagged with the new threshold of 16 µV. If you scroll through the data, you’ll see that almost all trials with a clear horizontal eye movement are now flagged for rejection.

    But do we really want to use this threshold, even though it means that we’d be rejecting over 2/3 of the trials? We’ll consider how to answer that question in the next exercise. But first, save this dataset as 10_MMN_preprocessed_filt_be_noblinks_HEOG16.


    This page titled 8.10: Exercise- Detecting Eye Movements is shared under a CC BY 4.0 license and was authored, remixed, and/or curated by Steven J Luck directly on the LibreTexts platform.

    • Was this article helpful?