ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RELSA 严重程度分区:用核密度估计挖掘 normal / attention / danger 阈值——scientific-agent-skills 中的带宽敏感性分析实战

RELSA 严重程度分区:用核密度估计挖掘 normal / attention / danger 阈值——scientific-agent-skills 中的带宽敏感性分析实战 RELSA 严重程度分区用核密度估计挖掘 normal / attention / danger 阈值——scientific-agent-skills 中的带宽敏感性分析实战【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientists worldwide. 165 ready-to-use validated skills plus 100 scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skillsRELSARELative Severity Assessment分数只有在你知道切点在哪里时才有意义一个 0.55 的分数究竟意味着需要关注还是濒临终点本指南围绕 scientific-agent-skills 仓库中relsa-severity-assessment技能的 thresholds-and-zones.md 文档完整讲解如何用核密度估计KDE从模型自身的 RELSA 分数分布中挖掘候选阈值、将其划分为 normal / attention / danger 三个分区并回答一个最关键的问题这些阈值到底有多可靠。读完本文你将掌握 R 语言stats::density默认参数的 Python 复现细节、带宽敏感性扫描的正确做法以及如何避免把数据挖掘出的分区误当成监管分级。为什么 RELSA 分数需要一个切点RELSA 把多个福利结局指标压缩成一个无量纲分数0 表示基线1 表示动物达到参考集的最大偏离见 relsa-method.md。但 0.55 这个数字本身没有意义——它只有在你知道了切点cut-points落在哪里之后才能解释。Lutscher et al. (2026) 的方法是从数据本身推导候选切点对某个模型中观察到的所有 RELSA 分数估计概率密度然后取密度的极小值minima——即分数簇之间稀疏分布的山谷。这些低谷区域就是低发生率的边界可以作为阈值。仓库中的 kde_thresholds.py 实现了这一整套流程。KDE 阈值方法原理与三个分区方法学基础对于每个观测值放置一个带宽为h的高斯核把它们平均起来就得到密度估计内部局部极小值标记了低发生率的区域可作为阈值Korneev et al., 2022; Gilles Heal, 2014。核密度估计本身的非参数思想源自 Rosenblatt (1956) 与 Parzen (1962) 的经典工作。两个极小值把量表切成三个分区分区含义normal低于较低的极小值——处于模型动物大多占据的分数范围内attention介于两个极小值之间——标记该动物需要更密切地监测danger高于较高的极小值——接近或达到个体终点注意一个前提必须把模型中的全部动物都纳入密度估计——包括到达终点的动物、存活者和假手术sham对照组。因为分区的目的是分离处于不同状态的动物的轨迹所有状态都必须有代表。从源码看这一步对应的正是find_thresholds()对整个输入列做密度估计没有任何按分组过滤的默认行为过滤是 CLI 层--group的可选项见 kde_thresholds.py。复现 R 的stats::density默认值实现刻意复现了 R 语言stats::density的默认参数因为这是论文使用的环境高斯核Silverman 的bw.nrd0带宽公式为0.9 * min(sd, IQR/1.349) * n^(-1/5)512 点的网格向数据范围两侧各扩展三个带宽cut 3。一个极易踩的坑scipy 自带的bw_methodsilverman是另一套公式如果直接传给它每个阈值都会偏移。因此 kde_thresholds.py 显式实现了bw_nrd0()而不是借用 scipy 的命名参数。源码级实现剖析kde_thresholds.pybw_nrd0()R 公式的逐行还原bw_nrd0()kde_thresholds.py把 R 的规则精确翻译为 Python标准差用np.std(values, ddof1)样本标准差与 R 一致四分位距用np.percentile(values, [75, 25])注释明确指出线性插值等价于R 的 type 7分位数定义常量IQR_TO_SIGMA 1.349源码注释特意强调 Rs bw.nrd0 uses this literal, not 1.34898——这是逐字复刻不是近似当散布估计塌缩为 0 时沿 R 的回退链处理lo sd or abs(values[0]) or 1.0最终返回0.9 * lo * n ** (-0.2)。测试 test_scripts.py 用x 1..10的解析解钉死了这条公式sd 3.02765、IQR 4.5期望值0.9 * min(sd, 4.5/1.349) * 10^-0.2精确到 12 位小数。density_curve()scipy 的带宽换算陷阱density_curve()kde_thresholds.py有一处精妙处理scipy 的gaussian_kde会用样本标准差缩放它的带宽因子所以代码先把目标带宽除以 sd 再传入kde gaussian_kde(data, bw_methodbw / sd if sd 0 else bw)。网格按 R 的约定生成np.linspace(data.min() - cut*bw, data.max() cut*bw, grid_size)默认cut 3.0、grid_size 512。find_thresholds()极小值检测、网格外过滤与深度截断find_thresholds()kde_thresholds.py在网格上逐点扫描极小值判定条件为dens[i] dens[i-1] and dens[i] dens[i1]within_dataTrue默认丢弃落在观测分数范围之外的极小值——否则填充网格extended grid可能制造假极小值n_thresholds只保留最深的 k 个极小值论文保留 2 个按密度值排序后截断再按位置排序数据不足少于 2 个有限值时直接抛错而不是静默返回无意义结果。当密度是单峰的内部极小值不存在结果携带一个空阈值列表——这是一个真实答案而不是失败详见下文实际操作。ThresholdResult分区划分与分配ThresholdResultkde_thresholds.py持有阈值、众数modes、带宽、样本量与密度曲线并提供三件关键能力zone_names()按阈值数量自动命名——1 个区域叫all2 个叫normal / danger3 个叫normal / attention / danger更多则编号zone1..zoneNassign()用np.searchsorted(thresholds, value, sideright)把每个分数映射到分区非有限值标记为undefined测试 test_scripts.py 验证了[0.337, 0.643]切出三种分区名、NaN落到undefinedas_dict()输出结构化 JSONthresholds、modes、bandwidth、n、各分区的低/高边界与计数供下游程序消费。已发表的阈值论文报告的模型切点文档给出了论文中三个模型的已发表阈值模型阈值备注Sepsis (CLP)0.337 和 0.6437 只小鼠239 个分数论文的 Figure 3DSS restraint stress0.250单阈值DSS blood sampling0.649单阈值胰腺癌和神经外科模型被排除在分析之外每个模型只有 1 只动物分数分布过于稀疏无法形成有意义的密度估计。一个值得记录的细节论文摘要把败血症的上限阈值写成 0.647而Results 和 Figure 3给出 0.643——这本身就是该流程两次运行之间差异极小的提醒。任何复现工作都应对这种同一来源内部的差异保持警惕。复现结果与脆弱性带宽敏感性分析本仓库复现了什么在公开的败血症数据上用论文的四项遥测变量、以 CLP 动物为参考集、排除基线时间点此时 RELSA 按构造等于 0239 个分数——精确复现论文声明的 7 只小鼠 239 个数据点阈值0.355 和 0.655对比已发表的 0.337 和 0.643把bwc体重变化纳入分数后为 0.363 和 0.644在0.9 ×bw.nrd0的带宽下极小值移动到0.335 和 0.633——与已发表的一对几乎一致。最后一行才是重点。在同样的 239 个分数上做带宽敏感性扫描带宽×bw.nrd0 0.0732找到的极小值0.700.310, 0.6300.800.322, 0.6280.900.335, 0.6331.000.355, 0.6551.10无——密度变成单峰≥ 1.25无带宽改变 10% 就能摧毁两个阈值。较低的阈值处在一个宽阔、浅平的山谷里在合理的带宽范围内漂移了 0.045较高的阈值相对稳定。测试套件同样钉死了这一性质test_thresholds_are_bandwidth_dependenttest_scripts.py用同一组双峰分数验证了窄带宽0.03有阈值、宽带宽0.5无阈值。还有两个额外的敏感性来源删掉一个变量可能改变极小值的数量分数分布的形状随之改变关闭算法的 2 位小数舍入——RELSA 算法本身会把 delta 和权重先舍入到两位小数见 relsa-method.md 的Rounding is part of the algorithm一节——在这个数据集上把两个极小值变成一个。报告要求绝不报告孤立的数值对因此永远不要把 KDE 阈值报告为一对孤立的数字。必须同时报告带宽分数数量使用的变量参考集一次敏感性扫描。并且优先报告扫描结果而非点估计——如果一个阈值只在某一个带宽下存活你发现的只是平滑器的性质而不是动物的性质。这也是 SKILL.md 报告清单reporting checklist中第 7 条的要求见 SKILL.md。薄分区过滤min_zone_fraction如何剔除尾部伪影有限样本的密度估计在尾部会蠕动wiggle一次蠕动就能产生一个把单个离群分数从其余分数中分离出来的局部极小值。文档给出的经验证据在从单一正态分布抽取的 300 个样本上本实现确实会找到这样一个极小值而且它恰好隔离一个观测——这是平滑器的性质不是严重程度分区。min_zone_fraction默认 0.02因此要求每个分区至少持有 2% 的分数不满足时丢弃界定该分区的最浅阈值反复检查直到全部满足。对应源码是_prune_thin_zones()kde_thresholds.py计算每个分区的计数找到最薄的分区其由阈值i-1和i界定然后弹出两者中较浅的那个。测试 test_scripts.py 验证了300 个N(0.4, 0.1)样本默认返回空阈值列表、分区名为all而min_zone_fraction0.0时保留那个隔离单个观测的伪极小值。这个过滤不会触碰已发表的败血症结果它的三个分区分别持有 239 个分数的 68.2%、22.2% 和 9.6%远高于 2% 的门槛。设置--min-zone-fraction 0可以看到原始极小值并预期其中混有尾部伪影。实际操作完整命令行工作流为一个模型计算候选分区# 候选分区附带图形、JSON 输出与分区标签 python skills/relsa-severity-assessment/scripts/kde_thresholds.py relsa_scores.csv --n-thresholds 2 \ --plot zones.png --json zones.json --label-out zoned.csv其中relsa_scores.csv是 relsa_score.py 的输出含relsa列。在仓库内置的合成示例队列上见 example_cohort.csv6 只小鼠、9 天SKILL.md 给出了完整的可运行版本python skills/relsa-severity-assessment/scripts/kde_thresholds.py relsa_scores.csv \ --group treatmenttreated --n-thresholds 2 --plot zones.png --json zones.json其输出形如KDE on 33 RELSA scores (bandwidth 0.1502) candidate thresholds (density minima): 0.703 density modes: 0.264, 0.866 normal [0.000, 0.703) n25 (75.8%) danger 0.703 n8 (24.2%)关键 CLI 参数一览CLI 由build_parser()kde_thresholds.py定义与文档实操一一对应参数默认值作用scores必填RELSA 分数 CSVrelsa_score.py的输出--columnrelsa保存 RELSA 分数的列名--group COLVALUE无可重复先按分组子集过滤再估计密度--n-thresholds无只保留最深的 k 个极小值论文保留 2--bandwidth无覆盖bw.nrd0带宽--grid-size512密度估计网格点数--include-outside关保留观测分数范围之外的极小值--min-zone-fraction0.02丢弃会隔离出小于该比例分数的分区的阈值尾部波动过滤--plot无写出密度图Figure 3 风格--json无把阈值写入 JSON 文件--label-out无把输入分数连同zone列写回 CSV--group支持COLVALUE并可按需重复例如限定treatmenttreated后做密度估计。--plot调用plot_thresholds()kde_thresholds.py用绿色/琥珀色/红色等色带填充各分区、黑色虚线标注阈值并在图中标注样本量与带宽。程序还会在 stderr 上打印一条固定的边界声明这些是候选的、模型特定的分区不是 EU Directive 2010/63/EU 下的严重程度分级也不跨模型或参考集可比。带宽敏感性检查答案能不能扛住for f in 0.8 0.9 1.0 1.1 1.2; do python - $f PY import sys, pandas as pd sys.path.insert(0, skills/relsa-severity-assessment/scripts) from kde_thresholds import find_thresholds, bw_nrd0 v pd.read_csv(relsa_scores.csv)[relsa].dropna() bw bw_nrd0(v.to_numpy()) * float(sys.argv[1]) print(sys.argv[1], [round(t, 3) for t in find_thresholds(v, bandwidthbw).thresholds]) PY done这段脚本把bw_nrd0的结果乘以 0.8 到 1.2 的系数观察极小值如何移动或消失。空阈值列表是一个真实答案这批队列的分数形成一个簇没有数据驱动的地方可切。此时不要为了逼出极小值而一味降低带宽——那只是在拟合平滑器而不是在发现动物状态的分界。当 KDE 一无所获时的两个备选方案k-means levels原始 RELSA 包通过对参考集分数做 k-means 聚类导出k1个水平relsa_levels默认k 4。同样是数据驱动、同样依赖参考集但它总是返回水平——哪怕数据里其实没有真实结构。模型自身的终点标准计算既往动物在人类终点humane endpoint实际达到时刻的 RELSA 分数用该值作为观察线。这直接可解释、不需要平滑器也正是论文 Figure 1 中individual endpoint线条的含义。边界声明这些不是监管严重程度分级EU Directive 2010/63/EU 要求对实验程序进行前瞻性的四类分级non-recovery非恢复、mild轻度、moderate中度、severe重度。RELSA 量表上的 KDE 分区不是这些类别——论文两次明说这些阈值不应与监管严重程度分级混淆并且既不可推广也不可直接转换为 EU Directive 2010/63/EU 下的严重程度类别。它们同样不可跨模型比较。因为 RELSA 相对于参考集定义且各实验室的临床评分并未统一一个模型中的 0.337 在另一个模型中毫无意义。论文自己观察到败血症0.337/0.643与 DSS0.250、0.649阈值相当接近这被当作共同阈值未来可能落在哪里的提示而不是它们可以互相迁移的证据。论文展望中统一量表需要用统一的技术和方法学手段、跨模型测量相同的参数——现实地讲就是高频自动化笼内监测automated home-cage monitoring。关键参考文献Rosenblatt, M. (1956). Remarks on some nonparametric estimates of a density function.Ann. Math. Stat.27, 832–837.Parzen, E. (1962). On estimation of a probability density function and mode.Ann. Math. Stat.33, 1065–1076.Węglarczyk, S. (2018). Kernel density estimation and its application.ITM Web Conf.23, 37.Korneev, A. et al. (2022). Multiclass histogram-based thresholding using kernel density estimation and scale-space representations. arXiv:2202.04785.EU Commission (2010). Directive 2010/63/EU.Official Journal of the European Union53, 16–25.RELSA 分数的完整算法方向性、基线归一化、参考集、RMS 权重见 relsa-method.md终点预测的 ARIMA 流程见 forecasting.md端到端可运行的工作流与报告清单见 SKILL.md算法逐行验证见 test_scripts.py。【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000 scientists worldwide. 165 ready-to-use validated skills plus 100 scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表