# Mixed ANOVA Analysis for Domain Means
# EOHI Experiment Data Analysis - Domain Level Analysis
# Variables: NPast_mean_pref, NPast_mean_pers, NPast_mean_val, NPast_mean_life
#           NFut_mean_pref, NFut_mean_pers, NFut_mean_val, NFut_mean_life

# Load required libraries
library(tidyverse)
library(ez)
library(car)
library(nortest)      # For normality tests
library(ggplot2)      # For plotting
library(emmeans)      # For post-hoc comparisons

setwd("C:/Users/irina/Documents/DND/EOHI/eohi1")

# Read the data
data <- read.csv("exp1.csv")

# Display basic information about the dataset
print(dim(data))
print(length(unique(data$pID)))

# Check experimental conditions
print(table(data$GROUP, data$TEMPORAL_DO, data$ITEM_DO))

# Check what domain mean columns are available
domain_mean_cols <- colnames(data)[grepl("mean_(pref|pers|val|life)", colnames(data))]
print(domain_mean_cols)

# Verify the specific variables we need
required_vars <- c("NPast_mean_pref", "NPast_mean_pers", "NPast_mean_val", "NPast_mean_life",
                   "NFut_mean_pref", "NFut_mean_pers", "NFut_mean_val", "NFut_mean_life")

missing_vars <- required_vars[!required_vars %in% colnames(data)]
if (length(missing_vars) > 0) {
  print(paste("Warning: Missing variables:", paste(missing_vars, collapse = ", ")))
} else {
  print("All required domain mean variables found!")
}

# Define domain mapping
domain_mapping <- data.frame(
  variable = c("NPast_mean_pref", "NPast_mean_pers", "NPast_mean_val", "NPast_mean_life",
               "NFut_mean_pref", "NFut_mean_pers", "NFut_mean_val", "NFut_mean_life"),
  time = c(rep("Past", 4), rep("Future", 4)),
  domain = rep(c("Preferences", "Personality", "Values", "Life"), 2),
  stringsAsFactors = FALSE
)

print(domain_mapping)

# Function to pivot data to long format
pivot_domain_means <- function(data, domain_mapping) {
  long_data <- data.frame()
  
  for (i in 1:nrow(domain_mapping)) {
    var_name <- domain_mapping$variable[i]
    time_level <- domain_mapping$time[i]
    domain_level <- domain_mapping$domain[i]
    
    # Check if variable exists
    if (!var_name %in% colnames(data)) {
      print(paste("Warning: Variable", var_name, "not found in data"))
      next
    }
    
    # Create subset for this variable
    subset_data <- data[, c("pID", "ResponseId", "TEMPORAL_DO", var_name)]
    subset_data$TIME <- time_level
    subset_data$DOMAIN <- domain_level
    subset_data$MEAN_DIFFERENCE <- subset_data[[var_name]]
    subset_data[[var_name]] <- NULL  # Remove original column
    
    # Add to long data
    long_data <- rbind(long_data, subset_data)
  }
  
  # Convert to factors with proper levels
  long_data$TIME <- factor(long_data$TIME, levels = c("Past", "Future"))
  long_data$DOMAIN <- factor(long_data$DOMAIN, levels = c("Preferences", "Personality", "Values", "Life"))
  long_data$pID <- as.factor(long_data$pID)
  long_data$TEMPORAL_DO <- as.factor(long_data$TEMPORAL_DO)
  
  return(long_data)
}

# Pivot data to long format
tryCatch({
  long_data <- pivot_domain_means(data, domain_mapping)
}, error = function(e) {
  print(paste("Error in data pivoting:", e$message))
  stop("Cannot proceed without proper data structure")
})

print(dim(long_data))
print(length(unique(long_data$pID)))
print(levels(long_data$TIME))
print(levels(long_data$DOMAIN))

# Check data types
print(is.factor(long_data$TIME))
print(is.factor(long_data$DOMAIN))
print(is.factor(long_data$pID))
print(is.numeric(long_data$MEAN_DIFFERENCE))

# Show first 20 rows
print(utils::head(long_data, 20))

# Display structure and sample
str(long_data)

print(utils::head(long_data, 10))

# Show example data for one participant
participant_1_data <- long_data[long_data$pID == 1, c("pID", "TEMPORAL_DO", "TIME", "DOMAIN", "MEAN_DIFFERENCE")]
print(participant_1_data)

# =============================================================================
# DESCRIPTIVE STATISTICS
# =============================================================================

# Overall descriptive statistics by TIME and DOMAIN
desc_stats <- long_data %>%
  group_by(TIME, DOMAIN) %>%
  summarise(
    n = n(),
    mean = round(mean(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    variance = round(var(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    sd = round(sd(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    median = round(median(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    q1 = round(quantile(MEAN_DIFFERENCE, 0.25, na.rm = TRUE), 5),
    q3 = round(quantile(MEAN_DIFFERENCE, 0.75, na.rm = TRUE), 5),
    min = round(min(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    max = round(max(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    .groups = 'drop'
  )

print("Descriptive statistics by TIME and DOMAIN:")
print(desc_stats)

# Descriptive statistics by between-subjects factors
desc_stats_by_group <- long_data %>%
  group_by(GROUP, TIME, DOMAIN) %>%
  summarise(
    n = n(),
    mean = round(mean(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    variance = round(var(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    sd = round(sd(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    .groups = 'drop'
  )

print("Descriptive statistics by GROUP, TIME, and DOMAIN:")
print(desc_stats_by_group)

# Overall means by TIME (collapsed across domains)
time_means <- long_data %>%
  group_by(TIME) %>%
  summarise(
    n = n(),
    mean = round(mean(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    variance = round(var(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    sd = round(sd(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    .groups = 'drop'
  )

print("Overall means by TIME (collapsed across domains):")
print(time_means)

# Overall means by DOMAIN (collapsed across time)
domain_means <- long_data %>%
  group_by(DOMAIN) %>%
  summarise(
    n = n(),
    mean = round(mean(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    variance = round(var(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    sd = round(sd(MEAN_DIFFERENCE, na.rm = TRUE), 5),
    .groups = 'drop'
  )

print("Overall means by DOMAIN (collapsed across time):")
print(domain_means)

# =============================================================================
# ASSUMPTION TESTING
# =============================================================================

# Remove missing values for assumption testing
long_data_clean <- long_data[!is.na(long_data$MEAN_DIFFERENCE), ]
print(paste("Data after removing missing values:", dim(long_data_clean)))

# 1. Missing values check
missing_summary <- long_data %>%
  group_by(TIME, DOMAIN) %>%
  summarise(
    n_total = n(),
    n_missing = sum(is.na(MEAN_DIFFERENCE)),
    pct_missing = round(100 * n_missing / n_total, 2),
    .groups = 'drop'
  )

print("Missing values by TIME and DOMAIN:")
print(missing_summary)

# 2. Outlier detection
outlier_summary <- long_data_clean %>%
  group_by(TIME, DOMAIN) %>%
  summarise(
    n = n(),
    mean = mean(MEAN_DIFFERENCE),
    sd = sd(MEAN_DIFFERENCE),
    q1 = quantile(MEAN_DIFFERENCE, 0.25),
    q3 = quantile(MEAN_DIFFERENCE, 0.75),
    iqr = q3 - q1,
    lower_bound = q1 - 1.5 * iqr,
    upper_bound = q3 + 1.5 * iqr,
    n_outliers = sum(MEAN_DIFFERENCE < lower_bound | MEAN_DIFFERENCE > upper_bound),
    .groups = 'drop'
  )

print("Outlier summary (IQR method):")
print(outlier_summary)

# 3. Normality tests
normality_results <- long_data_clean %>%
  group_by(TIME, DOMAIN) %>%
  summarise(
    n = n(),
    shapiro_p = ifelse(n >= 3 & n <= 5000, 
                      shapiro.test(MEAN_DIFFERENCE)$p.value, 
                      NA),
    anderson_p = ifelse(n >= 7, 
                       ad.test(MEAN_DIFFERENCE)$p.value, 
                       NA),
    .groups = 'drop'
  ) %>%
  mutate(
    shapiro_normal = shapiro_p > 0.05,
    anderson_normal = anderson_p > 0.05,
    overall_normal = case_when(
      !is.na(shapiro_p) & !is.na(anderson_p) ~ shapiro_normal & anderson_normal,
      !is.na(shapiro_p) ~ shapiro_normal,
      !is.na(anderson_p) ~ anderson_normal,
      TRUE ~ NA
    )
  )

print("Normality test results:")
print(normality_results)

# 4. Homogeneity of variance (Levene's test)
# Test homogeneity across TIME within each DOMAIN
homogeneity_time <- long_data_clean %>%
  group_by(DOMAIN) %>%
  summarise(
    levene_p = leveneTest(MEAN_DIFFERENCE ~ TIME)$`Pr(>F)`[1],
    homogeneous = levene_p > 0.05,
    .groups = 'drop'
  )

print("Homogeneity of variance across TIME within each DOMAIN:")
print(homogeneity_time)

# Test homogeneity across DOMAIN within each TIME
homogeneity_domain <- long_data_clean %>%
  group_by(TIME) %>%
  summarise(
    levene_p = leveneTest(MEAN_DIFFERENCE ~ DOMAIN)$`Pr(>F)`[1],
    homogeneous = levene_p > 0.05,
    .groups = 'drop'
  )

print("Homogeneity of variance across DOMAIN within each TIME:")
print(homogeneity_domain)

