如何在保持家族独立性前提下实现神经质分数的分层抽样划分

老杰吖_4963

老杰吖_4963

2026-10-21

959人浏览

原创

如何在保持家族独立性前提下实现神经质分数的分层抽样划分

本文介绍一种结合家族约束与神经质(neofac_n)分布均衡性的分层样本划分方法,利用 stratifiedkfold 实现“同家族不共存于同一子集 + 各子集神经质分布近似一致”的双重目标。

本文介绍一种结合家族约束与神经质(neofac_n)分布均衡性的分层样本划分方法,利用 stratifiedkfold 实现“同家族不共存于同一子集 + 各子集神经质分布近似一致”的双重目标。

在行为心理学或遗传学研究中,常需将被试划分为两个互斥子样本用于建模、验证或交叉分析,但必须同时满足两个关键约束:

  1. 家族独立性:来自同一家庭(Family_ID 相同)的被试不能出现在同一子样本中(避免血缘相关性引入偏差);
  2. 分布一致性:两组在关键协变量(如 Neuroticism 分数 NEOFAC_N)上的分布应尽可能相似,以保障组间可比性。

直接使用 train_test_split 或简单随机划分无法兼顾二者;而 StratifiedKFold 虽支持按标签分层,但其默认逻辑不感知“家族结构”。因此,我们需要对策略进行适配:将每个家族视为一个不可分割的“超样本单元”,并在该单元内分配成员至不同子集,同时依据其神经质分数进行分层决策。

核心思路如下:

  • 首先按 Family_ID 分组,确保每个家族最多含 2 名被试(如题设);
  • 对每个家族,将其成员视为一个候选对(单人家庭则仅一人),我们需为该家族指定“哪位成员进入子集 A,哪位进入子集 B”;
  • 将所有家族的神经质均值(或代表性分数)作为分层依据,构造虚拟“家族级标签”,再用 StratifiedKFold(n_splits=2) 划分家族 → 从而间接控制两组中高/中/低神经质家族的均衡分布;
  • 最后,根据家族分配结果,将对应成员分别填入 sample_1 和 sample_2。

以下是完整可运行的实现代码:

from sklearn.model_selection import StratifiedKFold
import numpy as np
import pandas as pd

# 假设 df_behavioral 已就绪(如题中生成逻辑)
# 步骤 1:按 Family_ID 分组,提取每家族的 Neuroticism 代表值(取均值;单人则直接取)
family_groups = df_behavioral.groupby('Family_ID')
family_neuroticism = family_groups['NEOFAC_N'].mean().round().astype(int)  # 离散化便于分层

# 步骤 2:为每个 Family_ID 构造分层标签(此处用四分位分组增强稳定性)
neuro_q4 = pd.qcut(family_neuroticism, q=4, labels=False, duplicates='drop').fillna(0).astype(int)
family_labels = neuro_q4.reindex(family_neuroticism.index)

# 步骤 3:使用 StratifiedKFold 将 Family_ID 划分为两组(stratified by family-level neuroticism)
skf = StratifiedKFold(n_splits=2, shuffle=True, random_state=42)
family_ids = family_neuroticism.index.values
_, family_test_idx = next(skf.split(family_ids, family_labels))

family_set_a = set(family_ids[family_test_idx])
family_set_b = set(family_ids) - family_set_a

# 步骤 4:按家族分配被试 —— 每个家族中,成员交替分配至 sample_1 / sample_2
sample_1_idx, sample_2_idx = [], []
for family_id, group in family_groups:
    indices = group.index.tolist()
    if len(indices) == 1:
        # 单人家庭:按家族分组归属决定去向
        if family_id in family_set_a:
            sample_1_idx.append(indices[0])
        else:
            sample_2_idx.append(indices[0])
    else:  # 双人家庭:强制分拆
        if family_id in family_set_a:
            sample_1_idx.append(indices[0])
            sample_2_idx.append(indices[1])
        else:
            sample_1_idx.append(indices[1])
            sample_2_idx.append(indices[0])

# 构建最终子样本
sample_1 = df_behavioral.loc[sample_1_idx].reset_index(drop=True)
sample_2 = df_behavioral.loc[sample_2_idx].reset_index(drop=True)

print(f"Sample 1 size: {len(sample_1)}, Sample 2 size: {len(sample_2)}")
print("Neuroticism distribution check:")
print(f"Sample 1 — Mean: {sample_1['NEOFAC_N'].mean():.2f}, Std: {sample_1['NEOFAC_N'].std():.2f}")
print(f"Sample 2 — Mean: {sample_2['NEOFAC_N'].mean():.2f}, Std: {sample_2['NEOFAC_N'].std():.2f}")

✅ 关键优势说明:

  • 家族完整性保障:groupby('Family_ID') 确保无跨家族混入;
  • 分层有效性:通过家族级神经质聚合 + qcut 分箱 + StratifiedKFold,显著提升两组在原始 NEOFAC_N 上的分布重叠度(可用 KS 检验或直方图验证);
  • 可扩展性:若某家族含 >2 成员,可扩展为“轮询分配”或“贪心匹配”,本例双人假设已覆盖多数家系设计。

⚠️ 注意事项:

  • 若家族规模高度不均(如存在 5+ 人家庭),需改用更复杂的图着色或整数规划策略;
  • StratifiedKFold 要求每类标签至少有 2 个样本,故分箱时使用 duplicates='drop' 并填充缺失;
  • 建议后续用 scipy.stats.ks_2samp 对两组 NEOFAC_N 进行分布等价性检验,确保 stratification 成效。

该方案在保持统计严谨性的同时,完全兼容 pandas 生态,无需额外依赖图算法库,是处理小规模家系数据分层划分的高效实践路径。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Python 机器学习入门与 Scikit-Learn 实战
Python 机器学习入门与 Scikit-Learn 实战

面向机器学习初学者,以 Scikit-Learn 为核心工具,讲解机器学习基本概念(监督学习/无监督学习/模型评估)、数据预处理(标准化/归一化/缺失值填充/特征编码)、常用分类算法(逻辑回归/决策树/随机森林/SVM/KNN)、回归算法(线性回归/岭回归/Lasso)、无监督聚类(K-Means/DBSCAN)、交叉验证与超参数调优(GridSearch/RandomSearch)、混淆矩阵与 ROC/AUC 模型评估指标,帮助开发者

2026.04.24

355

29

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

2026.10.21

0

15

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

2026.10.21

0

16

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

2026.10.21

0

16

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

100

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

80

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

40

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

40

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习