Buckets:

redmingwei's picture
|
download
raw
37.9 kB

超维度脑域数据集框架

方法节见 FRAMEWORK_METHODS.md(可直接用于论文);本文是设计与产物说明。

桶:hf://buckets/illusion-brain/brain-domains 索引:/domains/framework/framework_index.parquet、framework.json 构建器:/domains/scripts/build_framework_index.py


一、为什么不是一个张量

这个框架的形状由三条实测结论决定,不是设计偏好:

  1. 标签不是生成因子。 把 region / source / species / domain 投影到活动矩阵上, ‖Π_label X‖²/‖X‖² = 0.05%(exp48)。标签接近正交于数据流形,是外部贴上的元数据。
  2. 五层不是链,是偏序。 最长链长度为 0(exp47);Π 算子只在 source × region、 species × region 这类组合上可交换,domain 与任何属性都不可交换。
  3. 笛卡儿积 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 行,四个层级 —— unit 73 组(steinmetz)、segment 4 组 (counts_v4)、window 143 组(omnibrain_multi)、node 24 组(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 —

核查结果:一条真缺陷、两条我的误报、一条模型判断错误

这四条最初是从「对象行数」读出来的,逐条实测后只有第一条成立:

  1. 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。
  2. spike_view 少一个 session(误报):实际有 39 个 windows 文件、会话号 0–38 无缺号。 索引里的"38"是因为两个 session 的窗口形状相同 (6901, 64, 8),被合并成一条对象记录; 索引的 n_files 列是 2,我读成了对象行数。
  3. 猕猴视图不完整(误报):实际有 72 个 windows 文件、0–71 无缺号。索引只显示 11 条 对象记录,因为 72 个文件只有 11 种不同形状(例如 15 个文件都是 (2447, 64, 8))。
  4. 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。

这三个数不能互相替代,而且它们给出的次序相反:

  1. 共享相关衰减:猕猴 548 ms 比小鼠 365 ms 慢约 1.5×。用的切片是全部 72 个猕猴片段, 不是 τ 那 17 个形状合格的。这与 FINDINGS_MOUSE_50MS.md 里"两者都 400–500 ms"的 τ 结论不一致 —— 那个结论建立在 plateau 拟合上,而猕猴 55/72 的切片 rho 会转负, 本就不该用 plateau 外推。
  2. 单单元自相关:小鼠 568 ms 反而比猕猴 438 ms 慢 1.3×。与上一条方向相反。
  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。

三条仍然成立的限制:

  1. bin 宽 50 vs 20 ms;分箱只会把短半衰拉长,方向对结论保守。
  2. 只有 churchland 能匹配,不能写"猕猴"。
  3. 片段之间不独立,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 覆盖)而不是 τ 的原因。

这张表确立的三件事

  1. τ 不能跨全部成员比。 同一套 rho_curve 估计量只在 50 个切片上适用:小鼠 33、猕猴 17。 猕猴其余 55 个切片的 rho 在 max_lag 内转负 —— plateau 模型本就不适用,强行拟合得到的是外推值。
  2. 人类 EEG 的跨通道共同分量已被白化抹掉。 63 个通道的带符号相关均值 −0.0003…+0.019, 正负相消。ρ(跨单元共享相关)对它无效;但时间结构仍在(通道平均后的单序列 ACF:lag1=0.95、50–100 bin 处回升;汇总口径的 pooled_acf_lag1 是 0.759), 但那是另一个不变量,不能混进 τ 列。
  3. τ 的绝对值不可引用。 同一估计量在 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)⇒ 区间对比稳,绝对值才会漂。

八、下一步

  1. 把 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。
  2. 给每个成员补 Ψ_m(不变量提取器)与可逆性声明。
  3. 索引里目前 padding 只在 construction 名称上体现,应提升为独立布尔列。
  4. L0 的代码仓已 pin 到 commit + blob(falcon-code:770c9b9 + 两个 blob);论文 6 篇里 5 篇有 PDF(其中 3 篇走 bioRxiv 预印本),只剩 dandi000070(2012 年,无预印本)没有 PDF。
  5. 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.