Buckets:
超维度脑域数据集框架
方法节见
FRAMEWORK_METHODS.md(可直接用于论文);本文是设计与产物说明。
桶:hf://buckets/illusion-brain/brain-domains
索引:/domains/framework/framework_index.parquet、framework.json
构建器:/domains/scripts/build_framework_index.py
一、为什么不是一个张量
这个框架的形状由三条实测结论决定,不是设计偏好:
- 标签不是生成因子。 把
region / source / species / domain投影到活动矩阵上,‖Π_label X‖²/‖X‖² = 0.05%(exp48)。标签接近正交于数据流形,是外部贴上的元数据。 - 五层不是链,是偏序。 最长链长度为 0(exp47);
Π算子只在source × region、species × region这类组合上可交换,domain与任何属性都不可交换。 - 笛卡儿积 91.4% 是空。 理论 1680 个组合只存在 144 个。空不是缺数据,是结构上不可能。
由此推出的硬约束:结构层能并,活动层不能并。把不同数据集拼成一个 N × D 矩阵,
或把标签当作张量的轴,都会退化成 OmniBrain 那种 (n_win, 64, 8)——707 个单元压到 64 维、
EEG 63 通道补到 64 通道。那是压扁,只是从二维变成了三维。
二、三层对象
L0 成员层 X_m ∈ R^{d_1 × … × d_{k_m}} 阶数 k_m 因成员而异,2 ≤ k_m ≤ 4
L1 结构层 B = (species, modality, region, domain) 偏序;只提供键与空洞
L2 不变量层 z_m ∈ R^p 每个成员/每个切片的动力学标量
- L0 不补零、不共享单元轴。每个成员用自己的
Φ_m从原始数据构造。 - L1 不进入活动张量。它只回答"哪些成员可以按什么键连接",以及"哪些组合声明为空"。
- L2 是唯一允许跨成员比较的层。它不要求共享单元轴,只要求同一族估计量:
τ、参与率、谱斜率、有效维度、放电率。**键只能是
source/species/modality/session, 不能是region/domain**——exp63 已实测:33 个脑区的 τ 差异在区组置换下 p=0.386, 脑区不组织这一层的任何量。
"超维度"的含义就在 k_m 不齐:容器的 rank 由成员决定,不预设。索引里 rank 从 1(扁平
ragged 数组)到 4(THINGS-EEG 四轴)都有。
三、不同的数学构造(Φ)
| construction | 作用 | 是否含 padding |
|---|---|---|
counts_native |
整数计数,不重采样 | 否 |
counts_native_nwb |
NWB 原始格式,未转换 | 否 |
ragged_index_family |
offset + n_elements 索引族,bin_ms 逐行 |
否 |
pca_gram_pad64 |
逐 session Gram PCA → 64 维 | 是(不足 64 补零) |
identity_pad64 |
63 电极 → 64 | 是 |
graph_propagation_64 |
图信号传播 → 64 维,不读标签 | 否 |
graph_native |
节点特征表 | 否 |
eeg_native |
(trial, channel, time) |
否 |
eeg_4d_native |
(image, repetition, channel, time) |
否 |
mixed_views |
多来源混合(含 padding 视图) | 部分 |
padding 必须显式标出来。用 padding 视图做的任何结论,都要在卡片里注明它和原生成员的
差别——这正是 OmniBrain 当初被误读为"跨物种可比"的原因(EEG 第 64 通道是补零)。
四、连接规则
| 层 | 可以做什么 | 不可以做什么 |
|---|---|---|
| L1 结构 | 按物种/模态/解剖区 join;声明空组合 | 把 join 结果当成活动对齐 |
| L0 活动 | 成员内部任意分析;同成员跨 session 用索引族 | 跨成员拼 unit 轴;跨成员比较单个单元 |
| L2 不变量 | 跨成员比较 τ / 维度 / 谱斜率 | 用 region/domain 当分组键 |
L1 已落地:structure.parquet + joins.json
结构层不再只是上面这张表,而是两个可查询文件(构建器 build_l1_structure.py):
- **
structure.parquet**:244 行,四个层级 ——unit73 组(steinmetz)、segment4 组 (counts_v4)、window143 组(omnibrain_multi)、node24 组(flywire)。 每行带source/species/modality/region/region_kind/domain_l1与计数。 - **
joins.json**:8 个键的 join 合法性,按语义判定而不是按列名。
| 键 | 可跨成员 join | 词表 | 成员内去重值个数 |
|---|---|---|---|
source |
是 | shared | 1 / 1 / 2 / 4 |
species |
是 | shared | 1 / 1 / 2 / 3 |
modality |
是 | shared | 1 / 1 / 1 / 2 |
region |
部分 | multi_vocabulary | 3 / 24 / 33 / 73 |
domain_l1 |
部分 | multi_vocabulary | 3 / 6 / 13 |
unit |
否 | — | 跨成员的 unit 不是同一个神经元 |
window |
否 | — | 派生采样单位,stride 与长度不同 |
trial |
否 | — | 试次编号无共同含义 |
region 是 partial 而不是 yes:小鼠是 Allen 区名(73 个,unit 级)、猕猴是 Brodmann 区
(S1/PFC)、FlyWire 是 24 个 super_class,三套词表不能直接相等。omnibrain-multi 的映射状态(1,409,850 行):
unassigned 821,600(58.3%,EEG 无解剖区,不可修);有解剖标签的 588,250 行中,
精确 273,989(46.6%)——exact 16,199 + exact_single_species 257,790;
compound 168,048(28.6%,几乎全是猕猴的 M1_PMd);
粗粒度/上卷/任务码重释 122,390(20.8%,其中 task_code_reinterpreted 86,851 是把人类颅内电极
按任务码判成 M1,不是解剖定位);uberon_missing 23,823(4.1%,SCig/APN 等无 UBERON 节点)。
空洞率按这次用的轴重算:source × region × domain_l1,理论 3×33×6 = 594,实测 140 种,
76.4% 为空。这与 §六 的 91.4% 不是同一个数——后者是 exp47 用
source × modality × region × domain 四轴、1680 个组合算的。两个都成立,但不能互相替代。
region 不是一个可比的键,而是五种强度的证据。structure.parquet 新增 region_confidence:
| region_confidence | 含义 | 覆盖(按层级,不可跨层求和) |
|---|---|---|
anatomical |
解剖定位且有本体节点 | steinmetz 24,029 单元;multi 273,989 窗;counts_v4 2 段 |
anatomical_unmapped |
解剖定位但无 UBERON 节点 | multi 23,823 窗(SCig/APN 等) |
inferred |
由任务码推定,非解剖定位 | multi 86,851 窗(人类颅内电极 → M1) |
compound |
一个标签覆盖多个区 | multi 168,048 窗(M1_PMd) |
coarse |
粗粒度或上卷 | flywire 107,265 节点;multi 35,539 窗(其中 19,019 已解析到父区,16,520 为 PL 上卷) |
none |
无解剖标签 | multi 821,600 窗(EEG) |
粗标签的解析:structure.parquet 另有 region_resolved 与 region_resolution 两列。
DMFC → PFC(13,292 窗)与 Area2 → S1(5,727 窗)被标为 parent_rollup,其余 152,300 行为
as_labeled。注意这是解析到父区,不是提升精度:DMFC 与 Area2 本身已是具体解剖名,缺的是
UBERON 节点;映射到 PFC/S1 的价值是让两种编码(multi 与 counts_v4)能对到同一个父区。
region_confidence 仍保留 coarse,不因为解析而升级。
另一个正交维度:标签的归属粒度。 structure.parquet 还有 region_assignment:
| region_assignment | 含义 | 覆盖 |
|---|---|---|
per_unit |
每个单元一个真实解剖标签 | steinmetz 24,029 |
per_segment |
每个片段一个标签 | counts_v4 175 |
per_node |
每个节点一个标签 | flywire 107,265 |
window_area |
上游 area 列逐窗给出 |
multi 1,095,518(含 EEG 的无区行) |
session_majority |
整场主导区 | multi 小鼠 314,332 |
session_majority 的准确性实测(39 个 session):主导区占比中位 **26.6%(p10 20.0%,p90 36.9%),
按单元加权只有 27.1% 的单元被标对 —— 72.9% 的单元被归到自己并不在的区。
仅 9/39 个 session 的占比 ≥30%,3/39 ≥40%,0/39 ≥70%**。
region_confidence 与 region_assignment 是两个正交维度:前者问"标签映射得准不准",
后者问"标签贴到了哪些单元上"。omnibrain_multi 的小鼠窗口两者分别是 anatomical 与
session_majority —— 精确的标签贴在了错的单元上。因此区级分析只能使用
region_assignment == 'per_unit' 的数据(steinmetz 的单元表),multi 的小鼠窗不可用于区级结论。
这也正是 exp62「前额叶 1473 ms」的成因:把整场的 τ 记在主导区名下,而主导区平均只占 26.6%。
区身份用 Allen MBA id,不用 UBERON。 实测 73 个小鼠区经 Allen StructureGraph → MBAO → UBERON:
| 结果 | 区数 | 说明 |
|---|---|---|
unique |
12(16.4%) | UBERON 与区名一一对应,可作跨物种锚点 |
collision |
49(67.1%) | 多个区共用一个 UBERON,粒度到共同祖先 |
unmapped |
12(16.4%) | Allen 有结构但无 UBERON 命中 |
碰撞的规模:19 个区(AUD/CA/DG/MOs/PL/SUB/TH…)共用 UBERON:0002616;9 个(ACB/BLA/COA/LS…)
共用 UBERON:0009663;8 个(CL/LD/LGd/LP/MD/VPL/VPM…)共用 UBERON:0015233。
还有假阳性风险:直接按缩写查 UBERON,APN 会命中 UBERON:0035567 accessory pretectal nucleus,
而 Allen 的 APN 是 anterior pretectal nucleus(正确为 UBERON:0002565)。SCig、M1_PMd 缩写 0 命中。
必须先走 Allen ID。
因此 structure.parquet 新增 allen_mba_id(72/73 个区有,unknown 无)作为区身份;
uberon_id_unique 只在 12 个唯一映射上给值;其余由 region_uberon_status 标 collision / unmapped。
映射表在 framework/allen_region_map.csv,构建器 build_allen_uberon.py + finalize_allen_map.py。
上游文件与其许可:Allen structure_graph_download/1.json(638 KB,Allen Terms of Use)、
mbao.obo(3.2 MB,CC BY 4.0)、nervous-minimal.obo(3.0 MB,CC BY 3.0)。
猕猴:M1_PMd 可逐 unit 拆分(窗级不可)。 上游是 DANDI 000070(Churchill 2012),6 个 session
与桶内一致、每个 192 units;electrodes/location 为 96 × "Pre-Motor Cortex, dorsal" +
96 × "M1 Motor Cortex",6/6 session 都是 unit id 0–95 = PMd、96–191 = M1。
桶内 unit_idx 保持 NWB 原序(逐 unit 计数 Spearman = 0.9712,打乱零分布 p95 = 0.139),
所以可按位置回贴。framework/macaque_unit_region.csv 给出 13,126 个单元的标签
(PMd 6,432 / M1 6,432 / S1 114 / DMFC 148)。
但 omnibrain_multi 的窗是 64 维 PCA 投影,窗级无法事后拆分,只有单元级可拆;
因此多出来的 168,048 个 M1_PMd 窗在 L1 里仍是 compound,不能当区级样本。
area2-bump 的 S1_M1 是误标:其 electrodes 全为 "S1 Area 2",不含 M1。
人类颅内:不可恢复。 两个 DANDI 数据集(000950 / 000954)的 NWB 里
没有 /general/extracellular_ephys,连 ephys 模块都不存在;FALCON 的 preproc/h2_preproc.py
从头重建 NWB,只挂 Subject / trials / binned_spikes,电极表在发布阶段被构造性丢弃
(create_electrode_table 从未调用)。H2 只能从描述读到"左手中央前回 hand knob",H1 连半球都未记录。
因此那 86,851 个 inferred 窗无法转成解剖定位,只能保持"整阵列级推断"或整体排除。
单元级区登记表 unit_region_registry。 37,155 行 = 小鼠 24,029 + 猕猴 13,126,
每行一个单元,字段:member / species / slice / unit_idx / region_label / region_assignment / region_confidence / allen_mba_id / region_uberon_status / uberon_id_unique / label_source / source_file。
- 小鼠:
label_source = allen_acronym,72/73 个区有 Allen MBA id(unknown无)。 - 猕猴:
label_source = dandi_000070_electrodes,PMd 6,432 / M1 6,432 / S1 114 / DMFC 148。 - 全部
region_assignment = per_unit、region_confidence = anatomical。
这是框架里唯一"每个单元都有真实解剖标签"的表,区级分析只用它。omnibrain_multi 的窗
(小鼠是 session_majority、其余是 PCA 投影)不进入这张表,也不应用于区级结论。
verify_framework.py 把它的行数、唯一键与每成员区分布列为检查项(当前 101 项全过)。
过滤规则(写进 joins.json 的 recommended_filter):跨成员/跨物种比较只用
region_confidence == 'anatomical';inferred 与 compound 必须在图注里单列,不能混进主分析。
coarse 只可用于成员内分层,不可当解剖节点。
一处缺口:primate_human_eeg/trials.parquet 没有 region 列(只有 subject/split/session/
trial_idx/label/text),所以 EEG 在结构表里只以 unassigned 出现,没有解剖节点。
五、索引(对象级)
framework_index.parquet 的一行是一个对象(某成员的某种键/形状组合),不是一个目录。
同一成员目录里可能同时存在窗口张量、载荷矩阵、图嵌入,阶数不同,必须分开登记。
14 个成员、326 个对象。rank 分布:2 阶 190、3 阶 128、4 阶 4、1 阶 4(含 NWB 的 ragged spike_times)、0 阶 0。
"对象行"指索引里的一行;形状相同的文件已合并,文件数记在索引的 n_files 列。
| member | obj | rank | 对象行 | shape family | axes |
|---|---|---|---|---|---|
| steinmetz | spikes | 2 | 39 | 205–1240 × 52955–81668 | unit | time |
| steinmetz | units | 2 | 1 | 24029 × 6 | unit |
| primate_macaque_nlb | spikes | 2 | 16 | 40–192 × 3425–120234 | unit | time |
| primate_macaque_nlb | units / segments | 2 | 2 | 1360 × 6 / 72 × 8 | unit |
| primate_human_eeg | eeg | 3 | 2 | 200–1500 × 63 × 250 | trial | channel | time |
| primate_human_eeg | trials | 2 | 1 | 32000 × 7 | — |
| primate_dmfc_rsg | units/obs_intervals+spike_times | 1 | 1 | NWB:区间 + 稀疏 spike_times(2 文件) | spike_time |
| omnibrain_spike_view | windows | 3 | 38 | 6618–10207 × 64 × 8 | window | component | bin |
| omnibrain_spike_view | comps / mu / sd | 2 | 117 | 64 × 205–1240 等 | component | unit |
| omnibrain_spike_view | meta | 2 | 1 | 314332 × 5 | — |
| omnibrain_spike_view_macaque | windows | 3 | 11 | 170–6010 × 64 × 8 | window | component | bin |
| omnibrain_spike_view_macaque | meta | 2 | 1 | 187067 × 7 | — |
| omnibrain_spike_view_human | windows | 3 | 75 | 64–2499 × 64 × 8 | window | component | bin |
| omnibrain_spike_view_human | meta | 2 | 1 | 86851 × 8 | — |
| omnibrain_eeg_view | windows | 3 | 1 | 32000 × 64 × 8 | window | component | bin |
| omnibrain_eeg_view | P / meta | 2 | 2 | 64 × 63 / 32000 × 7 | — |
| omnibrain_eeg_view | ch_l1 / ch_names | 1 | 2 | 63 / 63 | — |
| omnibrain_graph_view | embeds / meta | 2 | 2 | 139255 × 64 / 139255 × 4 | node | embedding |
| omnibrain_multi | timeseries | 3 | 1 | 1409850 × 64 × 8 | window | component | bin |
| omnibrain_multi | index_timeseries | 2 | 1 | 1409850 × 19 | — |
| omnibrain_multi | graph / index_graph | 2 | 2 | 139255 × 64 / 139255 × 10 | — |
| omnibrain4d_eeg_test | eeg / band | 4 | 2 | 200 × 80 × 63 × 250 / × 5 | image | repetition | channel | time |
| omnibrain4d_eeg_test | meta | 2 | 1 | 160000 × 6 | — |
| omnibrain4d_eeg_train | eeg / band | 4 | 2 | 16540 × 4 × 63 × 250 / × 5 | image | repetition | channel | time |
| omnibrain4d_eeg_train | meta | 2 | 1 | 661600 × 6 | — |
| flywire | node_features | 2 | 1 | 107265 × 22 | node | feature |
| counts_v4_ragged | counts_ragged | 1 | 1 | 998102320(扁平) | flat |
| counts_v4_ragged | counts_index | 2 | 1 | 175 × 20 | — |
核查结果:一条真缺陷、两条我的误报、一条模型判断错误
这四条最初是从「对象行数」读出来的,逐条实测后只有第一条成立:
omnibrain_multi/labels.json过期(真缺陷,已修):原写 620,250 个样本,索引实际 1,409,850。差异全在human_eeg:标签里 32,000(只含 test),索引里 821,600 (test 160,000 + train 661,600)。已按index_timeseries.parquet重写,原值记进provenance,schema 升至 1.2。spike_view少一个 session(误报):实际有 39 个 windows 文件、会话号 0–38 无缺号。 索引里的"38"是因为两个 session 的窗口形状相同(6901, 64, 8),被合并成一条对象记录; 索引的n_files列是 2,我读成了对象行数。- 猕猴视图不完整(误报):实际有 72 个 windows 文件、0–71 无缺号。索引只显示 11 条
对象记录,因为 72 个文件只有 11 种不同形状(例如 15 个文件都是
(2447, 64, 8))。 primate_dmfc_rsg的阶数(模型判断错误,已修):NWB 内最大的二维数据集是units/obs_intervals(11320×2 / 324×2),说明它是「观测区间 + 稀疏 spike_times」, 不是(trial, time, unit)致密张量。索引已改为 rank 1 /spike_time。
另清掉一个真残留:primate/human_eeg/eeg_sub-01_train.npz.tmp.npz
(双扩展名,所以第一次 *.tmp 的 glob 没匹配到)。
教训:对象行数不是文件数。索引里一行 = 一种 (key, shape) 对象类,n_files 才是文件数;
同形状的不同 session 会合并。读索引时必须同时对 n_files 求和。
六、这个框架已经排除的解释
| 结论 | 证据 |
|---|---|
| 标签不能当轴 | Π_label 0.05%(exp48);poset 最长链 0(exp47) |
| 脑区不组织 τ | 33 区 / 203 格,区组置换 p=0.386;35 对同 session 成对比较 0 对过 FDR(exp63) |
| 跨物种 τ 不可直接排序 | 小鼠 497 / 猕猴 446 / 人类 183 ms,但无一对"同物种同技术"(exp62) |
| 形状不统一 | 小鼠 36% session 更适合幂律,猕猴/人类 0%(exp62) |
这些不是"负面结果",而是构造约束:它们决定了 L2 的合法键,也决定了 L1 里哪些 join 是空的。
重建后的护栏:verify_framework.py
任何一次重建后跑一次,35 项对账必须全过,否则说明产物之间已经漂移:
python /domains/scripts/verify_framework.py # 失败返回非零
它检查 11 组、共 101 项:A 索引(14 成员 / rank 合法 / rank>=2 必有 shape)、
B 结构(四个层级 / 各成员总数 24,029 / 175 / 1,409,850 / 107,265 / 三个标签维度取值合法)、
C L2(605 行 / 13 成员 / counts_v4_ragged 不在 / (member,slice) 唯一 /
tau_available 与 tau_status 一致 / 状态分布逐项)、D decay(是 L2 的子集 /
status=ok 必有值 / dmfc 四个量齐全 / 尖峰 111 切片)、D2 单元区登记(37,155 行 /
唯一键 / 小鼠 72/73 有 Allen id / 猕猴 PMd+M1 各 6,432)、E joins(8 键 / region 为
partial / 空洞率在 (0,1))、F–H 质量轴的三次尝试(每条都带「不许自欺」的护栏)、
I 索引与文档(schema 1.2 / 41 张表 / framework/ 无漏登 / 行数与字节数与实文件一致)、
J 来源 pin(12 条 / 无 broken / falcon-code 必须 commit + 双 blob)、
K L3 检索层(1,059 行 / 唯一 unit_id / 示例命中数与 catalog 对账)。
区级结果(用逐单元真标签重算,l2_region_invariants.parquet)
猕猴 PMd vs M1(67 个片段,同一阵列内各 96 单元,等样本量):
| PMd | M1 | 比值 | 95% CI | 一致性 | |
|---|---|---|---|---|---|
rho_half_ms 中位 |
623.0 | 496.4 | 1.20× | 1.15–1.28 | 64/67 个片段 PMd 更长,符号检验 p=6.8e-16,Wilcoxon p=1.4e-11 |
这是框架里第一个同会话、同阵列、等单元数的区级对比,不受 session 或单元数混杂。 但它是电极位置层面的对比:上游论文自己写明「M1-like neurons are frequently found in caudal PMd and vice versa」,所以只能读作「PMd 电极位 vs M1 电极位」,不能读作两种区类型的差异; 64/67 同向说明位置效应稳定,不说明细胞类型不同。
小鼠 68 个区、276 个 cell:rho_half 中位跨区从 90 ms(CA1)到 488 ms(MOs),约 5 倍。
区效应 R²(region|session) = 0.354,session 内置换 p = 0.0002(零分布 q50 = 0.225,
q95 = 0.283)。注意零分布中位就有 0.225——68 个区拟合 276 个 cell 本身会带来大量过拟合,
真实超出量是 0.354 − 0.283,存在但不夸张。
区效应的脱钩检验(小鼠,276 cell / 68 区)
| 检验 | 结果 |
|---|---|
| 逐 cell Spearman(log ρ_half, log n_units) | +0.148,p=0.014 |
| 逐 cell Spearman(log ρ_half, log rate) | +0.033,p=0.59 |
| session 内偏相关(n_units) | +0.169,p=0.0049 |
| session 内偏相关(rate) | +0.088,p=0.14 |
| R²(session) | 0.204 |
| R²(session + n_units + rate) | 0.232 |
| R²(session + 协变量 + region) | 0.569 |
| R²(region | session + 协变量) | 0.337,置换 p=0.0007(零分布 q95=0.273) |
| 跨区生态相关(中位 ρ_half vs 中位 n_units) | +0.318,p=0.059 |
| 跨区生态相关(vs 中位 rate) | +0.145,p=0.40 |
| 窄带 20–80 单元(148 cell / 52 区) | R²=0.405,p=0.134,零分布 q95=0.428 |
结论:放电率不是混杂(+0.03,p=0.59),调整后区效应依然存在(+0.337,p=0.0007)。 单元数解释了其中一部分(偏相关 +0.17,p=0.005;区级生态相关 +0.32,p=0.059),但控制单元数后 区效应仍显著。窄带 20–80 内不显著(p=0.134),但该检验只有 52 个区、148 个 cell,功效不足, **不能当作"无效应"**。
完整区表(36 个 ≥3 cell 的区,含每区中位单元数、放电率、ρ_half 与 session 聚类 CI)见
framework/region_table_full.csv。ρ_half 中位从 CA1 的 90 ms 到 VPM 的 1986 ms。
这与 exp62/exp63 的「脑区无效应」不矛盾,因为那是 τ 的结论。 τ 的 plateau 拟合只剩
50/780 个切片可用,且对零模型抽样敏感(10% 的格在重抽下翻倍);换成不拟合曲线的 rho_half
后,同一批标签上的区效应是可以检出的。问题在估计量的可用性,不在「脑区无差异」。
七、L2 不变量表(已建)
/domains/framework/l2_invariants.parquet — 一行 = 一个成员的一个切片。
列:member, slice, kind, n_units, n_bins, bin_ms, rate_hz, pr, erank, spec_slope, rho1, snr, n_points, neg_frac, max_lag_ms, tau_ms, tau_status, tau_available, note
τ 不只需要"能算",还需要"适用"。每个切片带一个状态位:
| tau_status | 含义 |
|---|---|
ok |
rho 在 max_lag 内保持正平台、SNR≥3、拟合收敛 |
shape_not_plateau |
rho 在 max_lag 内转负 —— plateau 模型本就不适用,拟合出的 τ 是外推 |
too_few_points |
可用滞后 < 10 |
low_snr |
rho[1]/noise < 3 |
fit_failed |
拟合未收敛 |
inapplicable_whitened |
通道间相关≈0,数据已白化,跨通道共享分量为零 |
not_estimable_8bins |
时间轴只有 8 个 bin(800 ms),τ 不可估 |
static |
无时间轴 |
too_short |
时间轴过短 |
状态分布(605 行 / 13 个成员):
| tau_status | n |
|---|---|
not_estimable_8bins |
439 |
not_computed |
2 |
shape_not_plateau |
58 |
ok |
50 |
inapplicable_whitened |
31 |
not_estimated_4d |
20 |
too_few_points |
3 |
static |
2 |
τ 只在 50 个切片上成立:
| member | 切片数 | τ 可用 | τ 中位 (ms) | p10–p90 |
|---|---|---|---|---|
| steinmetz | 39 | 33 | 987 | 306–3243 |
| primate_macaque_nlb | 72 | 17 | 1541 | 1073–1894 |
| primate_human_eeg | 31 | 0 | — | 通道间带符号相关 −0.0003…+0.019,判为已白化 |
| 其余 8 个成员 | — | 0 | — | 8 bin / 四轴未估 / 静态 |
PR / 有效秩 / 谱斜率(这些不要求时间轴,覆盖全部成员):
| member | PR 中位 | 有效秩 中位 | 谱斜率 中位 |
|---|---|---|---|
| steinmetz | 73.8 | 246.0 | −0.804 |
| primate_macaque_nlb | 9.9 | 57.8 | −1.079 |
| primate_human_eeg | 46.1 | 52.7 | −0.351 |
| omnibrain_spike_view | 16.5 | 33.7 | −0.996 |
| omnibrain_spike_view_macaque | 3.8 | 11.6 | −1.298 |
| omnibrain_spike_view_human | 53.0 | 58.7 | −0.365 |
| omnibrain_eeg_view | 13.4 | 20.4 | −1.255 |
| omnibrain4d_eeg_test | 42.4 | 52.1 | −0.449 |
| omnibrain4d_eeg_train | 49.4 | 55.7 | −0.329 |
| omnibrain_graph_view | 63.9 | 64.0 | −0.022 |
| primate_dmfc_rsg | 25.1 | 32.8 | −0.557 |
| omnibrain_multi | 23.0 | 41.7 | −0.831 |
| flywire | 1.4 | 1.9 | −4.630 |
PR 的上限是参与协方差的维度(omnibrain 视图恒为 64,所以 PR≤64),跨成员比较只在同量纲内成立。
覆盖 13 个成员。 counts_v4_ragged 已从 L2 移除——它的 175 段是 steinmetz / macaque /
human 的另一种编码(uint8 + offset/n_elements),保留会让同一批神经元被数两次。
它在 L0 索引与 L1 结构里仍有记录,只是不进入不变量层。
两个新补成员的细节(counts_v4_ragged 不再进入 L2):
| 成员 | 行数 | 构造 | 备注 |
|---|---|---|---|
primate_dmfc_rsg |
2 | NWB → 共有 obs_intervals 拼接 → 20 ms 分箱 | test 40 单元 / 23,875 bin,train 54 单元 / 240,440 bin;放电率 6.6–7.3 Hz;rho_half 165 / 333 ms,rho_zero 443 / 974 ms,pooled_acf_half 293 / 754 ms |
omnibrain_multi |
224 | 按 (source, group_key) 分组,每组最多 5,000 窗 |
8 bin 窗口,τ 与半衰均不可估,只贡献 PR/有效秩/谱斜率 |
模型无关的衰减尺度(补 τ 覆盖不到的切片)
τ 要求 plateau 形状,只覆盖 50 个切片。为此另加四个不拟合任何曲线族的量,
只找"曲线首次降到阈值"的滞后(线性插值),降不到就记 censored,不外推:
| 量 | 作用曲线 | 适用成员 |
|---|---|---|
rho_half_ms / rho_zero_ms |
跨单元共享相关 ρ 降到 50% / 0 | 尖峰(小鼠 + 猕猴) |
pooled_acf_half_ms / pooled_acf_zero_ms |
汇总自相关 Σ_j ACF_j(l) / Σ_j ACF_j(0) 降到 50% / 0 |
所有有时间轴的成员 |
pooled_acf 取的是同一次 FFT 的对角项 dia/dia[0],即和的比值(定义以这里为准),按各单元方差加权,
高发放单元主导。它不等于"逐单元 ACF 再平均"(比值的平均):实测 lag 1 处
小鼠 0.268 vs 0.196、猕猴 0.085 vs 0.058。要做等权版本必须逐单元归一化,本表没有做——
这是口径,不是误差。
| 量 | 小鼠 | 猕猴 | 人类 EEG | 四轴 EEG |
|---|---|---|---|---|
rho_half_ms 中位 (p10–p90) |
365 (240–837) n=38 | 548 (384–1085) n=72 | — | — |
rho_zero_ms 可用 / censored |
少(ρ 有正平台) | 多 | — | — |
pooled_acf_half_ms 中位 |
568 (285–3895) n=35 | 438 (323–746) n=72 | 24.3 (20.6–45.3) n=31 | 22.6 / 22.4 |
pooled_acf_lag1 中位 |
0.264 | 0.385 | 0.759 | 0.653 / 0.671 |
覆盖:rho_half 有 110/111 个尖峰切片可用(τ 只有 50 个);pooled_acf_half 有 158/162。
这三个数不能互相替代,而且它们给出的次序相反:
- 共享相关衰减:猕猴 548 ms 比小鼠 365 ms 慢约 1.5×。用的切片是全部 72 个猕猴片段,
不是 τ 那 17 个形状合格的。这与
FINDINGS_MOUSE_50MS.md里"两者都 400–500 ms"的 τ 结论不一致 —— 那个结论建立在 plateau 拟合上,而猕猴 55/72 的切片 rho 会转负, 本就不该用 plateau 外推。 - 单单元自相关:小鼠 568 ms 反而比猕猴 438 ms 慢 1.3×。与上一条方向相反。
- EEG 的 24 ms 是快衰减,不是 alpha。 alpha(约 10 Hz)在 ACF 上表现为 50–100 bin 处 的非单调回升(lag 50 时 0.295,高于 lag 20 的 0.168),"首次降到一半"只测到最前面的 快分量。要测 alpha 得换带通/谱峰,不能靠过零。
猕猴 vs 小鼠:先从单元数混杂里救出来
原始比较看起来是 1.50×,但两组的单元数分布完全不重叠(猕猴 ≤192,小鼠 ≥205),
而猕猴的 rho_half 随单元数强上升(ρ=+0.44,p=1e-4;21–50 档 114 ms → 101–200 档 564 ms),
小鼠基本平(ρ=−0.11,p=0.49)。所以原始差异不能直接归给物种。
匹配到 150 个单元后重算(每切片随机抽 150 单元,重复 20 次取中位):
| 小鼠 | 猕猴(churchland) | 比值 | 95% CI | 置换 p | |
|---|---|---|---|---|---|
rho_half_ms @150 units |
362 (n=39) | 564 (n=67) | 1.56× | 1.18–2.01 | 1e-4 |
差异没有消失。猕猴在 150 单元处的值(564)与它 101–200 档的原值一致,说明该量在此已饱和, 不是"多一个单元就多一截"。67 个可匹配切片全部来自 churchland —— 只有它到 192 单元。
未匹配的原始值保留作记录:rho_half 1.50× [1.07, 1.93];
pooled_acf_half 0.77× [0.57, 1.00] —— 后者两组的单元数档不重叠,不可用。
匹配档的敏感性(每档 12–20 次抽样取中位):
| 每切片单元数 N | 小鼠 (n=39) | 猕猴 (n=67) | 比值 | 95% CI | p |
|---|---|---|---|---|---|
| 100 | 315.8 | 568.4 | 1.80 | 1.22–2.17 | 1e-4 |
| 150 | 361.7 | 564.3 | 1.56 | 1.19–1.98 | 1e-4 |
| 192 | 351.9 | 564.0 | 1.60 | 1.12–1.97 | 1e-4 |
猕猴在 564–568 ms 几乎不动(它的 67 个片段全部恰好 192 单元,N=192 时用满),小鼠随 N 从 316 升到 362。
比值落在 1.56–1.80,三档 CI 均排除 1。所以 1.56× 不是 N=150 的单点结果;但它也不严格单调
(150→192 有小幅回升,来自抽样噪声)。数据:framework/rho_matched_multi.parquet、multi_stats.json。
三条仍然成立的限制:
- bin 宽 50 vs 20 ms;分箱只会把短半衰拉长,方向对结论保守。
- 只有 churchland 能匹配,不能写"猕猴"。
- 片段之间不独立,CI 偏窄。
可以写进论文的句子:在 churchland 数据上、单元数匹配到 150 后,跨单元共享相关的半衰比小鼠长 1.56 倍(95% CI 1.18–2.01)。
两个不能跨成员用的量
PR / 有效秩不是尺度无关的。 成员内 PR 与单元数的 Spearman:counts_v4 −0.64、macaque
−0.44、steinmetz +0.51,符号相反;全局只有 +0.05 —— 辛普森悖论。另外我先前算的
pr_rel = pr / min(n_units, n_bins) 对窗口成员是错的:那些成员的样本数是 n_win × 8 而不是 8,
所以出现了 >1 的值。结论:PR 只能在同一成员内部比较,跨成员无效。 上面的 PR 表因此只是
"成员内描述",不是不变量。
τ 的跨物种差异不显著:小鼠 987(n=33)vs 猕猴 1541(n=17),比值 1.56×,
CI **[0.80, 3.52]**,置换 p=0.092。点估计与 rho_half 一致(都是 1.56×),但形状过滤后
只剩 17 个猕猴切片,功效不够。这也是主结论用 rho_half(110/111 覆盖)而不是 τ 的原因。
这张表确立的三件事
- τ 不能跨全部成员比。 同一套
rho_curve估计量只在 50 个切片上适用:小鼠 33、猕猴 17。 猕猴其余 55 个切片的 rho 在 max_lag 内转负 —— plateau 模型本就不适用,强行拟合得到的是外推值。 - 人类 EEG 的跨通道共同分量已被白化抹掉。 63 个通道的带符号相关均值 −0.0003…+0.019,
正负相消。ρ(跨单元共享相关)对它无效;但时间结构仍在(通道平均后的单序列 ACF:lag1=0.95、50–100 bin 处回升;汇总口径的
pooled_acf_lag1是 0.759), 但那是另一个不变量,不能混进 τ 列。 - τ 的绝对值不可引用。 同一估计量在 L2 得到小鼠中位 987 ms,exp62 得到 497 ms,
差异来自
usable集合与零模型抽样(exp63 §10 已量化:10% 的格在重抽下翻倍以上)。 能比较的是同一批切片内的相对高低,不是毫秒数。
顺带查出的数据卫生问题:primate/human_eeg/ 里有一个 eeg_sub-01_train.npz.tmp 未清理的临时文件。
L2 的质量模型:有信号,但不能当过滤器
神经数据没有"干净/脏"的天然标签,质量只能用可复现性代理:同一 (session, region) 的单元
随机分两半、各算一次 τ,两半比值 ≤1.5 记为可复现。165 个 cell 可用,正例 87(52.7%),
两半比值中位 1.45×、p90 8.68× —— 近一半切片换个半样本就换结论。
只用四个便宜特征(log n_units、rho1、pooled_acf_lag1、erank)做逻辑回归,
按 session 分组 5 折:AUC 0.644(sd 0.059),200 次标签置换的零分布 q95 = 0.608,
p < 0.005;准确率 0.596 vs 多数类 0.527。但只用 rho1 单特征就有 0.626,
四特征合计只多 0.018。换一个标签(两半是否选中同一函数族)AUC 0.543、p = 0.275,无信号。
关键在耦合:quality_prob 与 rho1 的秩相关 +0.943,而高 rho1 的切片本来衰减就慢。
按 0.50 阈值过滤会保留 41% 的 cell,同时把 rho_half 中位从 285 ms 抬到 483 ms(1.69×);
| 阈值 | 保留 | rho_half 中位 |
相对不过滤 |
|---|---|---|---|
| — | 276/276 | 285.3 ms | 1.00× |
| 0.50 | 112/276 | 483.2 ms | 1.69× |
| 0.60 | 27/276 | 771.0 ms | 2.70× |
在 rho1 低/中分层内,高质量反而对应更短 rho_half(0.72× / 0.79×),方向都不统一。
所以这个分数只能作分层/加权变量,不能作估计 rho_half 前的硬过滤——
否则会重犯本框架一直在防的那类选择偏差。产物:quality_model.json、slice_quality.parquet、
quality_bias.json;细节见 FRAMEWORK_METHODS.md §6 末。
换一条不依赖 rho1 的轴:也失败,但量清了上限。 第二次改用「跨 session 一致性」当标签
(同区其他 session 的 rho_half 中位做参照,比值 ≤1.5 记为一致),特征换成六个与 rho1
基本不共线的分箱量:单元数、放电率、零 bin 比例、Fano 因子、presence ratio、前后半段漂移。
| 项 | 值 |
|---|---|
| 样本 | 231 cell(36 区),一致 72 = 0.312 |
标签 vs rho1 |
−0.054(p=0.41),标签本身干净 |
| 按区分组 AUC | 0.414(低于随机),置换 p = 0.89 |
| 标签分半可靠度 | 0.497 |
| 完美特征上限 | AUC 0.723 |
实测 0.414 远低于上限 0.723 ⇒ 强效应可排除;标签可靠度只有 0.497 ⇒ 弱效应排除不了。 另需注明:数据是 50 ms 分箱计数、没有原始 spike times,ISI 不应期这类标准单元质量 指标在本数据上算不出来,这条轴本身受数据结构限制。
顺带查出一个更该被引用的数字:同一区跨 session 的 rho_half 在 log 尺度上的 SD
中位 0.772(≈2.2×)、q90 1.533(≈4.6×);最稳 MB 0.25 / MOp 0.33,最散
SCs 2.79(≈16×)/ ILA 2.15 / CA3 1.74 / PL 1.60 / MOs 1.46。
这五个区的跨 session 离散度已经大到"按区引用中位数"没有意义。
换成员再试(猕猴):先假成功,查下去是否定。 同一套方法搬到猕猴(PMd/M1 各 96 单元 ×
67 个 churchland 片段),按片段分组 AUC 0.761、置换 p<0.005。三个信号否掉了它:
片段序号单独预测标签的 AUC 0.810(比模型还高)、只看前一半片段时掉到 0.586、
标签与 rho1 的相关从 −0.054 翻成 +0.398。
根因:67 个片段来自 6 个 session(Jenkins/Nitschke 不同日期),文件名序号按 session 成块, 用"同区所有片段"做参照等于把动物/日期差异当成质量。改成同 session 内参照 (5 个 session、128 cell)后:
| 项 | 值 |
|---|---|
| 留一 session AUC | 0.524,置换 p = 0.42 |
session 解释 log rho_half 方差 |
R² = 0.593 |
三个成员、四条标签,全部为负。 但这一轮查实了两件影响既有结论的事:
- session 解释 59% 方差、中位跨 session 差 2.2 倍,但留一 session 后中位仍在 516–600 ms (全量 562,±8%),只用无漂移的 3 个 session 是 576.7 ms ⇒ "猕猴 vs 小鼠 1.56×"没被搅动。
- 同 session 内漂移只出现在 2/5 个 session(×3.42、×3.70);而 PMd > M1 在 5 个 session 里全部 100%(64/64),中位比 1.208(1.044–1.419)⇒ 区间对比稳,绝对值才会漂。
八、下一步
把 L2 不变量表建出来已建(§七);L2 质量模型已建但受限(§七 末): AUC 0.644 只比单特征rho1高 0.018,且与被估计量同向耦合,只能分层不能过滤; 换用跨 session 一致性标签 + 六个非rho1特征后再试一次,AUC 0.414(置换 p=0.89), 距"完美特征上限 0.723"仍有大差距。两条路都堵死,除非能拿到原始 spike times。 后来拿到了(DANDI 上 range 读/units/spike_times):ISI 违反率可算, 但速率校正后 M1/PMd 的差距几乎不变(+0.0079 → +0.0078),仍不能当质量轴, 见framework/isi_quality2.json。- 给每个成员补
Ψ_m(不变量提取器)与可逆性声明。 - 索引里目前
padding只在 construction 名称上体现,应提升为独立布尔列。 - L0 的代码仓已 pin 到 commit + blob(
falcon-code:770c9b9+ 两个 blob);论文 6 篇里 5 篇有 PDF(其中 3 篇走 bioRxiv 预印本),只剩dandi000070(2012 年,无预印本)没有 PDF。 - L3 目前只有形式转换(窗口化 / PCA / 张量),没有语义改写;对神经数据是否该做语义改写尚未定论。
Xet Storage Details
- Size:
- 37.9 kB
- Xet hash:
- 1334ab9733fa180c1f3a2f95bddc394eeb85795048473a300aeb89bea0a1bf4a
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.