R/summary_se_within.R

Defines functions summary_se_within

summary_se_within <- function(data=NULL, measurevar, betweenvars=NULL, withinvars=NULL,
                       idvar=NULL, na.rm=FALSE, conf.interval=.95, .drop=TRUE) {
  #' @name summary_se_within
  #' @title norms data within units of observation
  #' @description normalize data within units of observation
  #' @param data main data frame
  #' @param measurevar column name of measured variable as string
  #' @param betweenvars column names of between-subject variables
  #' @param withinvars column names of within-subject variables
  #' @param idvar column names of units of observation
  #' @param na.rm should NAs be removed?
  #' @param conf.interval width of confidence interval
  #' @param .drop should unobserved variable combinations be dropped?
  #' @return the summarized data frame
  #'
  #'
  #' @export
  #'
  # Ensure that the betweenvars and withinvars are factors
  factorvars <- vapply(data[, c(betweenvars, withinvars), drop=FALSE],
                       FUN=is.factor, FUN.VALUE=logical(1))

  if (!all(factorvars)) {
    nonfactorvars <- names(factorvars)[!factorvars]
    message("Automatically converting the following non-factors to factors: ",
            paste(nonfactorvars, collapse = ", "))
    data[nonfactorvars] <- lapply(data[nonfactorvars], factor)
  }

  # Get the means from the un-normed data
  datac <- summary_se(data, measurevar, groupvars=c(betweenvars, withinvars),
                     na.rm=na.rm, conf.interval=conf.interval, .drop=.drop)

  # Drop all the unused columns (these will be calculated with normed data)
  datac$sd <- NULL
  datac$se <- NULL
  datac$ci <- NULL

  # Norm each subject's data
  ndata <- norm_data_within(data, idvar, measurevar, betweenvars, na.rm, .drop=.drop)

  # This is the name of the new column
  measurevar_n <- paste(measurevar, "_norm", sep="")

  # Collapse the normed data - now we can treat between and within vars the same
  ndatac <- summary_se(ndata, measurevar_n, groupvars=c(betweenvars, withinvars),
                      na.rm=na.rm, conf.interval=conf.interval, .drop=.drop)

  # Apply correction from Morey (2008) to the standard error and confidence interval
  #  Get the product of the number of conditions of within-S variables
  nWithinGroups    <- prod(vapply(ndatac[,withinvars, drop=FALSE], FUN=nlevels,
                                  FUN.VALUE=numeric(1)))
  correctionFactor <- sqrt( nWithinGroups / (nWithinGroups-1) )

  # Apply the correction factor
  ndatac$sd <- ndatac$sd * correctionFactor
  ndatac$se <- ndatac$se * correctionFactor
  ndatac$ci <- ndatac$ci * correctionFactor

  # Combine the un-normed means with the normed results
  merge(datac, ndatac)
}
MirkoTh/rutils documentation built on May 30, 2024, 9:02 p.m.