使用psych包autoR函数时遇dim(X)必须为正长度错误的求助
问题背景与报错
我有一个名为data的数据框,包含重复study_id的多场次观测数据,Positive或Negative字段存在NA值(甚至两者均为NA)。使用psych包做自相关分析时:
mssd(data$Negative, group=data$study_id, lag = 1, na.rm=TRUE) rmssd(data$Negative, group=data$study_id, lag=1, na.rm=TRUE) autoR(data$Negative, group=data$study_id, lag=1, na.rm=TRUE, use="pairwise")
mssd()和rmssd()可正常运行,但调用autoR()时触发错误:
Error in apply(x[1:(n.obs - lag), ], 2, sd, na.rm = na.rm) : dim(X) must have a positive length
即使设置na.rm=TRUE或用na.omit()处理数据,错误依然存在。数据结构如下:
structure(list(study_id = structure(c(001, 001, 002, 002, 003, 003), format.spss = "F6.0", display_width = 0L), Date = structure(c(18584, 18584, 18585, 18585, 18585, 18585), format.spss = "DATE11", display_width = 0L, class = "Date"), SignalNumber = structure(c(1, 2, 1, 2, 1, 2), format.spss = "F8.2", display_width = 0L), Negative = structure(c(1, 3.3, 1.5, 4, NA, 1.5), format.spss = "F8.2", display_width = 0L), Positive = structure(c(4.33333333333333, NA, 2.66666666666667, NA, 3, 4), format.spss = "F8.2", display_width = 0L)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
错误原因
autoR()的分组处理逻辑和mssd()/rmssd()不同:它要求每个分组内的有效非NA观测数至少大于lag+1,否则分组处理后的数据维度会变为0,触发报错。- 看数据里的
study_id=003:Negative字段仅1个有效非NA值,而lag=1需要至少2个有效观测才能计算滞后1期的自相关,这个分组的有效数据量不满足要求,导致函数内部的apply操作处理空数据,抛出错误。 - 全局用
na.omit()删NA会把study_id=003的第一行删掉,但该分组仍只剩1条数据,依然达不到要求,还会破坏其他分组的结构,不是正确处理方式。
解决方法
方法1:提前过滤样本量不足的分组
先筛选出每个study_id下Negative非NA观测数≥lag+1的分组,再传入autoR():
library(dplyr) # 筛选符合要求的分组 valid_groups <- data %>% group_by(study_id) %>% summarise(n_valid = sum(!is.na(Negative))) %>% filter(n_valid >= 2) %>% # lag=1,需要至少2个有效观测 pull(study_id) # 过滤后调用autoR() autoR(data$Negative[data$study_id %in% valid_groups], group=data$study_id[data$study_id %in% valid_groups], lag=1, na.rm=TRUE, use="pairwise")
方法2:手动分组计算自相关
如果不想丢弃分组,可以用dplyr手动计算每个分组的自相关系数,样本量不足的分组会返回NA,不会报错:
library(dplyr) data %>% group_by(study_id) %>% arrange(SignalNumber) %>% # 确保观测按场次排序 mutate(lag_neg = lag(Negative, n=1)) %>% summarise(auto_cor = cor(Negative, lag_neg, use="pairwise.complete.obs"))
方法3:修改autoR源码(不推荐)
如果一定要保留所有分组且用autoR(),可以修改函数源码,添加对分组样本量的判断,跳过样本不足的分组。但这种方法需要熟悉源码逻辑,风险较高,不如前两种稳妥。
内容的提问来源于stack exchange,提问作者AcidCatfish
相关产品推荐
相关产品推荐

