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

求助:基于多列Z-score(有效数≥3)计算均值与标准差的实现方案

多列Z-score的均值、标准差计算及异常样本识别方案

以下提供R和Python两种常用工具的实现代码,完全匹配你的需求:

R语言实现

  • 先统计每个样本的非缺失Z-score数量,筛选出至少3个有效值的样本
  • 对筛选后的样本计算每行Z-score的均值和标准差
  • 基于参考组的均值Z-score统计量,标记出异常样本
# 加载示例数据(实际使用时替换为你的数据导入代码,如read.csv)
df <- data.frame(
  Subject = c("as4", "as1", "as8", "as10"),
  Zscore1 = c(-2.4, -2.6, -2.7, NA),
  Zscore2 = c(-1.2, -1.4, NA, -1.7),
  Zscore3 = c(NA, -0.7, -0.1, -0.9),
  Zscore4 = c(-2.3, -1.4, NA, 2.3),
  Zscore5 = c(1.6, -1.4, -1.1, 1.7),
  Group = c("ER", "TL", "TL", "ER")
)

# 1. 统计每行非缺失Z-score的数量,筛选符合条件的样本
zscore_cols <- grep("Zscore", colnames(df), value = TRUE)
df$non_na_count <- rowSums(!is.na(df[zscore_cols]))
df_filtered <- df[df$non_na_count >= 3, ]

# 2. 计算每个样本的Z-score均值和标准差
df_filtered$z_mean <- rowMeans(df_filtered[zscore_cols], na.rm = TRUE)
df_filtered$z_sd <- apply(df_filtered[zscore_cols], 1, sd, na.rm = TRUE)

# 3. 定义参考组(这里以ER组为例,可根据需求修改)
ref_group <- df_filtered[df_filtered$Group == "ER", ]
ref_mean <- mean(ref_group$z_mean)
ref_sd <- sd(ref_group$z_mean)

# 4. 标记与参考组均值相差1个及以上标准差的样本
df_filtered$is_outlier <- abs(df_filtered$z_mean - ref_mean) >= ref_sd

# 查看最终结果
print(df_filtered)

Python语言实现(基于Pandas)

  • 利用Pandas的行统计功能筛选有效样本
  • 批量计算每行的均值和标准差
  • 对比参考组统计量,识别异常样本
import pandas as pd
import numpy as np

# 加载示例数据(实际使用时替换为pd.read_csv等导入方式)
data = {
    "Subject": ["as4", "as1", "as8", "as10"],
    "Zscore1": [-2.4, -2.6, -2.7, np.nan],
    "Zscore2": [-1.2, -1.4, np.nan, -1.7],
    "Zscore3": [np.nan, -0.7, -0.1, -0.9],
    "Zscore4": [-2.3, -1.4, np.nan, 2.3],
    "Zscore5": [1.6, -1.4, -1.1, 1.7],
    "Group": ["ER", "TL", "TL", "ER"]
}
df = pd.DataFrame(data)

# 1. 筛选出至少3个非缺失Z-score的样本
zscore_cols = [col for col in df.columns if "Zscore" in col]
df["non_na_count"] = df[zscore_cols].count(axis=1)
df_filtered = df[df["non_na_count"] >= 3].copy()

# 2. 计算每个样本的Z-score均值和标准差(ddof=1对应样本标准差)
df_filtered["z_mean"] = df_filtered[zscore_cols].mean(axis=1)
df_filtered["z_sd"] = df_filtered[zscore_cols].std(axis=1, ddof=1)

# 3. 计算参考组(以ER组为例)的均值和标准差
ref_group = df_filtered[df_filtered["Group"] == "ER"]
ref_mean = ref_group["z_mean"].mean()
ref_sd = ref_group["z_mean"].std(ddof=1)

# 4. 标记异常样本
df_filtered["is_outlier"] = abs(df_filtered["z_mean"] - ref_mean) >= ref_sd

# 输出结果
print(df_filtered)

注意:代码中参考组默认设为ER组,你可以根据实际需求修改Group == "ER"中的组别名称;实际数据导入时,替换示例数据加载代码为对应的数据读取函数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:05:40