在R中计算个体内每日情绪的平均自相关系数
解决方案:个体每日情绪自相关系数计算
第一步:构造符合场景的模拟数据
先构建和你场景匹配的多层数据(个体-日期-时序情绪值),方便后续测试:
set.seed(123) library(tibble) sim_data <- tibble( id = rep(1:5, each = 3*24), # 5个个体,每个个体3天,每天24条小时级情绪记录 date = rep(rep(seq.Date(as.Date("2024-01-01"), as.Date("2024-01-03"), by = "day"), each = 24), 5), mood = rnorm(5*3*24, mean = 5, sd = 1) + rep(rnorm(5, 0, 0.5), each = 3*24) + # 个体间固定差异 rep(rep(rnorm(15, 0, 0.3), each = 24), 1) # 个体内每日波动差异 )
方案一:dplyr + purrr 手动实现(稳定可控)
这种方式无需依赖quest包,自定义逻辑更灵活,避免适配问题:
library(dplyr) library(purrr) # 1. 按个体+日期分组,嵌套每日数据;2. 计算每组lag=1的自相关;3. 求个体的每日自相关平均值 final_result <- sim_data %>% group_by(id, date) %>% nest() %>% mutate( daily_acf = map_dbl(data, ~ { # 计算lag=1的自相关,跳过NA,不输出绘图 acf_res <- acf(.x$mood, lag.max = 1, plot = FALSE, na.action = na.pass) acf_res$acf[2] # 提取lag=1的自相关值(acf结果中第2位对应lag=1) }) ) %>% ungroup() %>% group_by(id) %>% summarise(avg_daily_acf = mean(daily_acf, na.rm = TRUE)) # 查看结果 print(final_result)
方案二:调整quest::auto_by的用法(适配原思路)
如果坚持使用quest包,问题大概率是分组变量或函数返回值格式不匹配,调整如下:
library(quest) library(tidyr) # 创建个体+日期的组合分组变量,确保auto_by能识别独立的每日组 sim_data <- sim_data %>% mutate(id_date = paste(id, date, sep = "_")) # 使用auto_by计算每个(id,date)组的自相关系数 group_acf <- auto_by( data = sim_data, by = "id_date", # 自定义函数必须返回单个数值,避免结构报错 FUN = function(x) acf(x$mood, lag.max = 1, plot = FALSE, na.action = na.pass)$acf[2], out.type = "tibble" # 指定输出为tibble,方便后续处理 ) # 拆分分组变量,计算个体的每日自相关平均值 final_result <- group_acf %>% separate(id_date, into = c("id", "date"), sep = "_", convert = TRUE) %>% group_by(id) %>% summarise(avg_daily_acf = mean(FUN.out, na.rm = TRUE)) print(final_result)
关键注意事项
- 若数据存在NA值,务必在
acf()中设置na.action = na.pass或na.action = na.omit,避免中断计算 - 若需要计算多阶自相关(如lag=1到3),可修改
lag.max参数后取对应位置的平均值 - quest::auto_by要求
FUN返回单个值,若返回向量或列表会触发结构不匹配报错
内容的提问来源于stack exchange,提问作者maddhatt1
相关产品推荐
相关产品推荐

