# Relabeling or Defining Interest Areas

#### Vincent Porretta

#### 2025-12-06

## Basic interest area relabelling

### Check interest area coding

First, ensure that you have loaded your data appropriately and that you have already carried out initial preprocessing using the functions `prep_data` and `relabel_NA`. The subsequent preprocessing requires that the interest area IDs are numerically, ranging from 0 (i.e., outside all interest areas) up to a maximum of 8. So, it’s important to check that the IDs present in the data set, conform to this. The `check_ia` functions does just this and indicates how those IDs are mapped to the interest area labels.

    check_ia(data = checkdat)

    ##  RIGHT_IA_ID RIGHT_IA_LABEL
    ##            0        Outside
    ##           11        Object1
    ##          234        Object2
    ##          399        Object3
    ##          444        Object4

    ##  LEFT_IA_ID LEFT_IA_LABEL
    ##           0       Outside

    ## Interest Area IDs for the left eye are coded appropriately between 0 and 8.
    ## Interest Area ID and label mapping combinations for the right eye are consistent.
    ## Interest Area ID and label mapping combinations for the left eye are consistent.

    ## Error in check_ia(data = checkdat): Interest Area IDs for the right eye are not between 0 and 8. Please recode before proceeding with data processing.

### Providing new labels and IDs for existing interest areas

The function `recode_ia` can be used to relabel interest area IDs (if they do not conform) or interest area labels (if you desire different ones). New IDs and/or labels can be specified using a named character vector. The following code serves as an example. Note that if your interest area labels contain spaces you must also put the old names in quotes.

    newdat <- recode_ia(data=checkdat, IDs=c("0"="0", "11"="1", "234"="2", "399"="3",
                                             "444"="4"),
                            Labels=c(Outside="Outside", Object1="Target",
                                     Object2="RhymeCompetitor", Object3="OnsetCompetitor",
                                     Object4="Distractor"))

    ## Right interest area IDs recoded.

    ## Left interest area IDs recoded.

    ## Right interest area labels recoded.

    ## Left interest area labels recoded.

    check_ia(data = newdat)

    ##  RIGHT_IA_ID  RIGHT_IA_LABEL
    ##            0         Outside
    ##            1          Target
    ##            2 RhymeCompetitor
    ##            3 OnsetCompetitor
    ##            4      Distractor

    ##  LEFT_IA_ID LEFT_IA_LABEL
    ##           0       Outside

    ## Interest Area IDs for the right eye are coded appropriately between 0 and 8.
    ## Interest Area IDs for the left eye are coded appropriately between 0 and 8.
    ## Interest Area ID and label mapping combinations for the right eye are consistent.
    ## Interest Area ID and label mapping combinations for the left eye are consistent.

## Remapping gaze position to newly defined interest areas

Sometimes it is necessary to make changes to the interest areas after data collection. This may be because it is of interest to examine some other aspect of looking patterns in the experiment, or a mistake was made when initially defining the interest areas in Experiment Builder. Because this can be a laborious task in Data Viewer, the following example shows how this redefinition and remapping can be done using functions provided in this package prior to completing the preprocessing of the data. In short, the function `custom_ia` uses a look-up table to determine if the gaze position coordinates fall within newly defined interest areas. For this you will need to create a look-up table containing the interest area definitions. Below are the steps that can be used to quickly create this table.

### Creating the look-up table

The look-up table requires specific information. In particular, in needs the event (participant specific trial) for which the interest areas are defined, the label of the interest area, the numeric ID of the interest area, and the top, bottom, left, and right pixel boundaries of the interest area. The reason these need to be specified for each event is that it is common for interest areas to move depending on the item/trial. Creating this sounds like a lot of work, but can actually be accomplished straightforwardly from an interest area report output by Data Viewer (especially if you have included the locations in your data source).

So, first export an interest area report for your data as a tab-delimited text file, including all available columns (to ensure you get all the necessary columns as well as the ones you output from your data source). Import that into R.

    library(VWPre)
    IAdat <- read.table("IAreport.txt", header = T, sep = "\t", na.strings = c(".", "NA"))

You will notice that the data are organized so that there is one row per interest area for each trial.

RECORDING_SESSION_LABEL | TRIAL_INDEX | IA_LABEL
--- | --- | ---
14001 | 1 | Target
14001 | 1 | RhymeComp
14001 | 1 | OnsetComp
14001 | 1 | Distractor
14001 | 2 | Target
14001 | 2 | RhymeComp
14001 | 2 | OnsetComp
14001 | 2 | Distractor
14001 | 3 | Target
14001 | 3 | RhymeComp
14001 | 3 | OnsetComp
14001 | 3 | Distractor

Next, create the Event column. Typically this is done using the Subject Identifier and Trial Index.

    IAdat$Event <- interaction(IAdat$RECORDING_SESSION_LABEL, IAdat$TRIAL_INDEX, drop = T)

Next you need to create a column which indicates the location of each interest area for a specific trial. If you defined this in your data source and output all columns to the eye-tracking file, these should already be included in your interest area report. In the example below, the columns (NAME_reg) indicate a numeric index (in this case Cartesian quadrants) of where the target and other objects were located per trial. This information must be unified into a single column so that it can be used later to merge in other information.

    dat1 <- IAdat %>% mutate(ScreenLoc = ifelse(IA_LABEL=="Target", target_reg,
                            ifelse(IA_LABEL=="RhymeComp", rhymecomp_reg,
                                   ifelse(IA_LABEL=="OnsetComp", onsetcomp_reg,
                                          ifelse(IA_LABEL=="Distractor", distractor_reg, NA))))
                      )

To create the bounding boxes of the region locations, make a dataframe that includes the top, bottom, left, and right pixel boundaries. These will, of course, be dependent on the resolution of the screen used in the experiment.

    Loc_Table <- data_frame(ScreenLoc = c(1, 2, 3, 4),
                            Top = c(40, 40, 740, 740),
                            Bottom = c(340, 340, 1040, 1040),
                            Left = c(1160, 460, 460, 1160),
                            Right = c(1460, 760, 760, 1460))

The dataframe should look similar to the following.

ScreenLoc | Top | Bottom | Left | Right
--- | --- | --- | --- | ---
1 | 40 | 340 | 1160 | 1460
2 | 40 | 340 | 460 | 760
3 | 740 | 1040 | 460 | 760
4 | 740 | 1040 | 1160 | 1460

This table will be merged with the interest area report, matching by ScreenLoc column.

    dat2 <- inner_join(dat1, Loc_Table, by="ScreenLoc")

The look-up table (as with other functions in VWPre) requires a numeric interest area ID column. This can be created directly from the `IA_LABEL` column, as follows by corresponding the Labels to the IDs.

    dat2$IA_ID <- case_when(
      dat2$IA_LABEL == "Target" ~ 1,
      dat2$IA_LABEL == "RhymeComp" ~ 2,
      dat2$IA_LABEL == "OnsetComp" ~ 3,
      dat2$IA_LABEL == "Distractor" ~ 4
    )

Lastly, select only the required columns for the look-up table.

    LookUpTable <- dat2 %>% select(Event, IA_LABEL, IA_ID, Top, Bottom, Left, Right)

The table should now look similar to the following.

Event | IA_LABEL | IA_ID | Top | Bottom | Left | Right
--- | --- | --- | --- | --- | --- | ---
14001.1 | Target | 1 | 40 | 340 | 460 | 760
14001.1 | RhymeComp | 2 | 740 | 1040 | 1160 | 1460
14001.1 | OnsetComp | 3 | 40 | 340 | 1160 | 1460
14001.1 | Distractor | 4 | 740 | 1040 | 460 | 760
14001.2 | Target | 1 | 40 | 340 | 1160 | 1460
14001.2 | RhymeComp | 2 | 740 | 1040 | 1160 | 1460
14001.2 | OnsetComp | 3 | 40 | 340 | 460 | 760
14001.2 | Distractor | 4 | 740 | 1040 | 460 | 760
14001.3 | Target | 1 | 740 | 1040 | 460 | 760
14001.3 | RhymeComp | 2 | 40 | 340 | 460 | 760
14001.3 | OnsetComp | 3 | 740 | 1040 | 1160 | 1460
14001.3 | Distractor | 4 | 40 | 340 | 1160 | 1460

### Performing the gaze remapping

Make sure your sample report has been loaded appropriately and that you have carried out the function `prep_data`. This will ensure that the necessary columns are coded appropriately and that the Event column has been created. Then simply feed that data frame, along with the lookup table, to the function `custom_ia`.

    remapped <- custom_ia(data = sampledata, iaLookup = LookUpTable)

This function examines the gaze coordinates of each sample for each event and evaluates which interest area it falls in, based on the information contained in the lookup table. Because this works row-wise, it can take a bit of time for large datasets.

After the remapping is complete, you are then ready to continue preprocessing your data. Please refer to the Basic Preprocessing vignette for further details.