
本文介绍一种结合家族约束与神经质得分(neofac_n)分层平衡的样本分割方法,利用 stratifiedkfold 实现等比例、无血缘重叠、分布近似一致的两组划分。
本文介绍一种结合家族约束与神经质得分(neofac_n)分层平衡的样本分割方法,利用 stratifiedkfold 实现等比例、无血缘重叠、分布近似一致的两组划分。
要满足三个关键目标——等大小分割、家族内个体不共存于同一子集、神经质得分分布高度可比——直接按 Family_ID 拆分(如取每家首/次成员)虽能保证无关性,却无法控制 NEOFAC_N 的分布偏移。理想方案需将“分层”逻辑与“家族隔离”逻辑协同建模。
核心思路是:将每个家庭视为一个不可分割的单元(unit),再对这些单元按其代表性的神经质得分进行分层抽样。由于每个家庭最多含 2 名被试(如题中 np.repeat(..., 2) 所示),我们可为每户定义一个“家族级神经质特征”,例如取均值、中位数或任一成员得分(需固定规则)。随后,将全部家庭按该特征离散化为若干层(如使用 pd.qcut 划分为 3–5 个神经质水平组),再在各层内随机分配家庭至 train/test 组,确保两组家庭数量尽可能均衡,且同一家族的所有成员始终进入同一组(从而天然满足“无亲属共组”约束)。
以下是完整实现代码(兼容原数据结构,并增强鲁棒性):
import numpy as np
import pandas as pd
from sklearn.model_selection import StratifiedShuffleSplit
# 假设 df_behavioral 已就绪(同原问题生成逻辑)
# 步骤1:按 Family_ID 聚合,构建家庭单元表(每行 = 一个 Family_ID)
family_df = df_behavioral.groupby('Family_ID').agg({
'Subject_ID': list,
'NEOFAC_N': 'mean' # 使用均值作为该家庭的代表性神经质得分
}).reset_index().rename(columns={'NEOFAC_N': 'Fam_Neuroticism'})
# 步骤2:对家庭级神经质得分进行分层(离散化为 4 层,便于 StratifiedShuffleSplit 均衡分配)
family_df['Neuroticism_Quartile'] = pd.qcut(
family_df['Fam_Neuroticism'],
q=4,
labels=False,
duplicates='drop'
).fillna(0).astype(int)
# 步骤3:使用 StratifiedShuffleSplit 对家庭单元进行 50/50 分层分割
sss = StratifiedShuffleSplit(n_splits=1, test_size=0.5, random_state=42)
train_family_indices, test_family_indices = next(sss.split(family_df, family_df['Neuroticism_Quartile']))
# 步骤4:还原为原始被试级索引
train_families = family_df.iloc[train_family_indices]['Family_ID'].tolist()
test_families = family_df.iloc[test_family_indices]['Family_ID'].tolist()
sample_1 = df_behavioral[df_behavioral['Family_ID'].isin(train_families)].reset_index(drop=True)
sample_2 = df_behavioral[df_behavioral['Family_ID'].isin(test_families)].reset_index(drop=True)
print(f"Sample 1: {len(sample_1)} subjects from {len(train_families)} families")
print(f"Sample 2: {len(sample_2)} subjects from {len(test_families)} families")✅ 优势说明:
- 家族完整性:每个
Family_ID全员归属同一子集,彻底规避亲属混入; - 分层有效性:
StratifiedShuffleSplit在家庭层级上最小化各组神经质四分位分布差异; - 灵活性强:支持任意家庭规模(不限于 2 人),且
qcut自动适配数据分布; - 可复现:
random_state保障结果稳定。
⚠️ 注意事项:
- 若某家族仅含 1 人,仍参与分层,不影响逻辑;
- 避免直接对原始被试使用
StratifiedKFold—— 它无法感知家族依赖关系,将导致血缘泄漏; - 如需严格 1:1 样本量,可在分割后微调:从较大组中随机剔除少量家庭(优先选神经质居中家庭),并验证分布偏移是否在可接受范围(如 KS 检验 p > 0.1)。
最终,该方法在保障遗传独立性的前提下,使两组在人格特质维度上具备统计可比性,为后续建模(如机器学习预测、组间 t 检验)奠定稳健基础。

















