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

使用ppcor包运行pcor.test偏相关分析时出现‘x必需是数值’错误的问题咨询

解决ppcor::pcor.test的"'x'必需是数值"错误

你遇到的问题核心原因很明确:pcor.test要求控制变量z必须是数值型(向量或矩阵),但你的Day_Name是字符型分类变量,哪怕x和y都是数值型,只要z不符合类型要求,就会触发这个错误。

下面是两种可行的解决方案,你可以根据需求选择:

方法1:将分类变量转换为数值型因子

这种方式简单直接,适合你把星期当成有序变量的场景(比如从周日到周六有顺序):

# 先加载数据并清理缺失值(pcor.test不支持缺失值)
work <- structure(list(Year = c("2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021"), Month_Number = c("8", "8", "8", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9"), Month_Name = c("August", "August", "August", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September", "September"), Day_Number = c(29L, 30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L), Day_Name = c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), Time_Wake = c(730L, 800L, 730L, 500L, 715L, 600L, 600L, 700L, 600L, 700L, 500L, 500L, 500L, 500L, 700L, 645L, 700L, 630L, 645L, 700L, 600L, 700L), Start_Work = c(1400L, 1100L, 930L, 1015L, 1000L, 945L, 1400L, 1500L, 915L, 930L, 1000L, 940L, 840L, 730L, 1700L, 945L, 1040L, 955L, 945L, 930L, 745L, 800L), End_Work = c(1900L, 1755L, 1520L, 1800L, 1600L, 1210L, 1700L, 1515L, 1530L, 1530L, 1800L, 1650L, 1800L, 1410L, 2000L, 1710L, 1430L, 1800L, 1840L, 1720L, 1915L, NA), Mins_Sleep = c(420L, 360L, 360L, 300L, 540L, 540L, 480L, 480L, 480L, 480L, 420L, 300L, 240L, 480L, 300L, 420L, 360L, 390L, 405L, 420L, 360L, 420L), Workout_Y_N = c("N", "Y", "N", "Y", "Y", "Y", "N", "N", "N", "N", "Y", "Y", "N", "N", "N", "N", "Y", "Y", "Y", "N", "N", ""), Time_Workout = c(NA, NA, NA, 730L, 730L, 730L, NA, NA, NA, NA, 730L, 730L, NA, NA, NA, NA, 735L, 735L, 735L, NA, NA, NA), Work_Environment = c("Home", "Office", "Office", "Office", "Office", "Office", "Home", "Home", "Office", "Office", "Office", "Office", "Office", "Home", "Home", "Office", "Office", "Office", "Home", "Office", "Home", "Home"), Coffee_Cups = c(4L, 0L, 1L, 3L, 0L, 2L, 6L, 4L, 5L, 3L, 3L, 2L, 2L, 3L, 1L, 1L, 3L, 2L, 2L, 0L, 1L, 1L), Tea_Cups = c(0L, 2L, 2L, 2L, 4L, 2L, 0L, 0L, 2L, 0L, 2L, 4L, 0L, 0L, 0L, 2L, 6L, 5L, 0L, 2L, 0L, 0L), Mins_Work = c(300L, 420L, 310L, 435L, 350L, 145L, 135L, 15L, 60L, 60L, 390L, 395L, 395L, 315L, 80L, 580L, 175L, 545L, 230L, 435L, 370L, NA), Onset_Mood = c("Tired", "Tired", "Sad", "Angry", "Rested", "Rested", "Rested", "Tired", "Tired", "Tired", "Rested", "Angry", "Tired", "Rested", "Angry", "Angry", "Angry", "Sad", "Rested", "Sad", "Tired", "Tired")), class = "data.frame", row.names = c(NA, -22L))

# 移除含缺失值的行(Mins_Work有NA)
work_clean <- na.omit(work)

# 将Day_Name转换为因子后转数值
work_clean$Day_Numeric <- as.numeric(factor(work_clean$Day_Name))

# 运行偏相关分析
library(ppcor)
pcor.test(x=work_clean$Mins_Work, y=work_clean$Coffee_Cups, z=work_clean$Day_Numeric)

方法2:使用哑变量控制无序分类变量(更严谨)

如果星期对你来说是无序分类变量(比如周一和周日没有顺序差异),用哑变量矩阵来控制会更准确,避免把分类变量当成有序变量的偏差:

# 基于清理后的数据集创建哑变量矩阵,移除参考组(这里默认移除第一个水平"Sunday")
day_dummies <- model.matrix(~ Day_Name - 1, data = work_clean)[, -1]

# 传入所有哑变量作为控制变量
pcor.test(x=work_clean$Mins_Work, y=work_clean$Coffee_Cups, z=day_dummies)

额外注意事项

  • 必须处理缺失值:pcor.test无法处理包含NA的观测,所以我用na.omit()移除了缺失行,你也可以根据需求用均值/中位数填充缺失值。
  • 哑变量的参考组选择:上面的代码移除了第一个哑变量(Sunday),你可以根据需要调整参考组,比如用relevel(factor(work_clean$Day_Name), ref = "Monday")来指定参考组。

内容的提问来源于stack exchange,提问作者Shawn Hemelstrand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:27:42