R使用sensobol包计算sobol指数提示找不到Y_A对象问题咨询
报错产生原因
触发object 'Y_A' not found错误的核心原因有两个,均和输入参数不符合sobol_indices函数的内部计算逻辑有关:
- 函数名拼写错误:构建Sobol抽样矩阵的正确函数名为
sobol_matrices,原代码写为sobol_matricies(拼写时多了1个i,正确拼写以ces结尾),导致生成的输入矩阵结构不符合要求,函数无法按规则拆分出计算必需的A、B两类基础抽样矩阵,后续匹配模型输出时找不到对应分段。 - 响应变量长度不匹配:sensobol包默认生成的Sobol矩阵总行数为
N * (参数个数 + 2),以原代码参数(N=50、5个输入参数)计算,矩阵总行数为350行,对应要求输入的响应变量Y长度必须等于350。原代码直接从output.df提取MY字段时未做长度校验,输出长度和矩阵行数不匹配,函数内部拆分Y为A矩阵对应输出Y_A、B矩阵对应输出Y_B、交叉矩阵对应输出段时,找不到符合长度要求的Y_A对象,直接抛出错误。
另外原代码第一行函数调用末尾多了多余的英文句号,也可能导致意外的语法问题。
对应解决方法
按以下步骤调整代码即可正常运行:
- 修正拼写错误,正确生成符合要求的Sobol抽样矩阵,删除行尾多余标点:
# 先加载sensobol包 library(sensobol) # 正确生成抽样矩阵 input.df <- sobol_matrices(N = 50, params = c("x1", "x2", "x3", "x4", "x5"))
- 保证响应变量y的长度和抽样矩阵行数完全一致。如果是用自定义模型计算响应,直接逐行传入抽样矩阵计算即可;如果是调用外部工具生成的输出结果,必须先校验长度再传入函数:
# 方案1:直接基于抽样矩阵计算模型输出,替换成你实际的模型逻辑即可 my_model <- function(data_row) { # 示例模型逻辑:y = 2*x1 + 1.5*x2 + 0.3*x3 + 0.1*x4 + 0.05*x5 2*data_row["x1"] + 1.5*data_row["x2"] + 0.3*data_row["x3"] + 0.1*data_row["x4"] + 0.05*data_row["x5"] } y <- apply(input.df, 1, my_model) # 方案2:使用外部输出数据集时先做长度校验,不匹配会直接终止运行提示问题 # y <- output.df$MY # stopifnot(length(y) == nrow(input.df))
- 调用
sobol_indices函数计算Sobol指数:
MY.sobol <- sobol_indices( matrices = input.df, Y = y, N = 50, params = c("x1", "x2", "x3", "x4", "x5") )
说明:
Y_A是sobol_indices内部调用的中间变量,不需要用户手动定义,只要输入的抽样矩阵结构合规、响应变量长度匹配,函数会自动完成中间变量的生成和计算,不会再触发对应报错。
内容的提问来源于stack exchange,提问作者S. Jeon
相关产品推荐
相关产品推荐

