You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sobol敏感性分析:响应y与设计x长度不匹配问题求解

搞定sensitivity::tell()里响应长度不匹配的问题

先明确核心问题:sensitivity包做Sobol敏感性分析时,设计矩阵和响应向量的长度必须严格对应——你用包生成的Sobol设计,它的X矩阵行数是固定的(n*(变量数+2),n是基础样本量),对应的响应y必须和这个行数完全一致。你自己生成了2000行设计,但响应长度对不上,要么是没按包的规则准备设计,要么是外部实验的响应和设计行没一一对应。

下面给你具体解决步骤:

1. 用包内置函数生成设计的情况

如果是用sensitivity::sobol()生成标准Sobol设计,比如:

library(sensitivity)
# 生成500个基础样本、3个变量的Sobol设计
sobol_design <- sobol(n = 500, dim = 3)
# 这里X矩阵的行数是500*(3+2)=2500行
nrow(sobol_design$X)

你必须基于这2500行的sobol_design$X去做外部实验,得到2500个响应值组成的向量y,再传入tell(),绝对不能少也不能多。

2. 自己手动生成2000行设计的情况

如果你是自己搞的2000行Sobol设计,得先把它整理成包能识别的结构:

  • 先拆分你的2000行矩阵:比如假设对应n=400、3个变量(400*(3+2)=2000),那前400行是X1(基础样本),中间400行是X2(对比样本),剩下的1200行拆成3组,每组400行,分别是替换第1、2、3个变量后的矩阵(对应X12、X13、X23)。
  • 手动构建Sobol类对象:
# 替换成你自己的2000行设计矩阵
your_design <- matrix(runif(2000*3), nrow=2000)

my_sobol <- list(
  n = 400,
  dim = 3,
  X = your_design,
  X1 = your_design[1:400, ],
  X2 = your_design[401:800, ],
  X12 = your_design[801:1200, ],
  X13 = your_design[1201:1600, ],
  X23 = your_design[1601:2000, ]
)
# 给对象打上sobol类标签,让包能识别
class(my_sobol) <- "sobol"

然后确保你的y是正好2000个值的向量,再执行:

my_sobol <- tell(my_sobol, y)
# 计算敏感性指数
sobol_indices <- sensitivity::sobol.indices(my_sobol)
print(sobol_indices)

3. 常见坑排查

  • 检查外部实验:是不是每一行设计对应一个响应?有没有重复做实验或者漏做的情况?
  • 关于示例里的ishigami.fun(x$X):如果返回更长的向量,要么是你传入的x$X不是标准Sobol设计的合并矩阵,要么是函数内部做了额外重复计算,得核对函数的输入输出逻辑。

验证用的完整示例

用内置的Ishigami函数跑一遍,确保流程没问题:

library(sensitivity)
# 生成标准设计
x <- sobol(n = 100, dim = 3)
# 生成对应长度的响应:x$X有500行,y就有500个值
y <- ishigami.fun(x$X)
# 传入tell函数
x <- tell(x, y)
# 查看敏感性指数
print(sobol.indices(x))

内容的提问来源于stack exchange,提问作者Lefty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:37:11