You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:06:18