R/interpolate_pupil.R

Defines functions interpolate_pupil

Documented in interpolate_pupil

#' Turns pupil sizes with blinks NA and linearly interpolates values
#' @param datafile data frame.
#' @param extendblinks blinks already extended  in data frame 
#' @param type type of interpolation (linear or cubic)
#' @param maxgap max number of NAs to interpolate. 
#' @param hz recording frequency of ET
#' @export
#' @import zoo
#' 
#' @return data frame containing interpolated data 
#' 
interpolate_pupil<-function(datafile, extendblinks=FALSE, maxgap=Inf, type=NULL, hz=NA) {
#supports linear and cublic-spline interpolation
  if (maxgap!=Inf){
    maxgap <- round(maxgap/(1000/hz))
  }
  
  if (extendblinks==FALSE & type=="linear") {
message("Turning pupil size with blinks to NA")
  blinks_na <- datafile %>% dplyr::mutate(pup = ifelse(blink==1, NA, pupil)) #turns blinks into NA for interpolation
  message("Performing linear interpolation")
  pupil_interp <- blinks_na %>%
    dplyr::group_by(subject, trial) %>%
    dplyr::mutate(interp = zoo::na.approx(pup, rule=2)) %>% 
    dplyr::ungroup() 
    return(pupil_interp)
  }
  
  if (extendblinks==TRUE & type=="linear") {
message("Performing linear interpolation")
pupil_interp <- datafile %>%
  dplyr::group_by(subject, trial) %>%
  dplyr::mutate(interp = zoo::na.approx(extendpupil, na.rm = FALSE, rule=2)) %>% 
  dplyr::ungroup() 
return(pupil_interp)

  }
  
  if (extendblinks==FALSE & type=="cubic") { 
    message("Turning pupil size with blinks to NA")
    blinks_na <- datafile %>% dplyr::mutate(pup = ifelse(blink==1, NA, pupil)) #turns blinks into NA for interpolation
    message("Performing cubic interpolation")
    pupil_interp <- blinks_na %>% dplyr::group_by(subject, trial) %>% 
      dplyr::mutate(index = ifelse(is.na(pup), NA, dplyr::row_number()),index=zoo::na.approx(index, na.rm=FALSE, rule=2), 
                    interp = zoo::na.spline(pup, na.rm=FALSE, x=index, maxgap=maxgap)) %>% 
    dplyr::ungroup()
  
    return(pupil_interp)
  }
  
  if (extendblinks==TRUE & type=="cubic") { 
    message("Performing cubic interpolation")
    pupil_interp <- datafile %>% dplyr::group_by(subject, trial) %>% 
      dplyr::mutate( 
                    index = ifelse(is.na(extendpupil), NA, dplyr::row_number()),             
                    index= zoo::na.approx(index, na.rm=FALSE), 
                    interp = zoo::na.spline(extendpupil, na.rm=FALSE, x=index, maxgap=maxgap)) %>%
    dplyr::ungroup()
      
    return(pupil_interp)
  }
    
    }

  
jgeller112/gazer documentation built on Jan. 13, 2020, 1:04 p.m.