我正在处理水文时间序列数据,并尝试构建自助法人工神经网络模型。为了使用置信区间进行不确定性评估,必须确保在重新抽样/自助法处理原始时间序列数据集时,原始时间序列中的每个值在所有自助样本中至少被保留两次,以便计算该时间点的方差和置信区间。
背景介绍如下:
我使用了一个包含标准降水指数值的月度时间步长的水文时间序列,该时间序列跨度为429行×1列,我们称这个时间序列向量为X
。X
的所有元素/值都已被归一化和标准化到0
和1
之间。
然后使用神经网络将时间序列X
与一些目标值(与X
具有相同长度和条件)进行训练,以生成目标值的新估计,我们称这个输出向量为O
(与X
具有相同长度和条件)。
现在我需要对X
进行ii =1:1:200
次重新抽样(即自助样本大小为200
),长度为429,且有放回抽样。让我们称所有自助样本放置的矩阵为M
。我使用B = randsample(X, length(X), true)
并通过for循环填充M
,使得M(:,ii) = B
。注意:我还在randsample
语句之后添加了rng('shuffle')
,以保持随机数生成器移动到新的状态,希望它能提供更随机的结果。
现在我需要测试我的数据重新抽样用于创建置信区间的效果如何。
我的程序如下:
- 生成一个for循环,使用上述程序创建
M
- 创建一个新变量
Xc
,它将保存自助样本ii for ii = 1:1:200
中未被重新抽样的X
的所有值 对于j=1:1:length(X),使用Xc(j,ii) = setdiff(X, M(:,ii))填充'Xc'
,如果元素j
存在于M(:,ii)
中,则用NaN
填充Xc(j,ii)
。Xc
现在是一个与M
相同大小和维度的矩阵。计算Xc
每行的NaN
值数量,并放入向量CI
中。- 如果
CI
中的任何行大于[自助样本大小,在本例中为(200) - 1]
,则在此点无法创建置信区间。
当我运行这个程序时,我发现从我的集合X
中选择的值几乎总是重复的,即用于生成M
中所有样本的X
的值是相同的。大约是原始时间序列中相同的~200个数据点总是被选中来创建新的自助样本。
我如何有效地修改我的程序或使用任何特定的函数来避免第(5)点的负面解决方案?
以下是我的代码示例,但请注意脚本中使用的变量可能与此处的文本不同。
感谢您的帮助,请查看下面的代码。
for ii = 1:1:Blen % for循环创建我们想要的自助样本数量 B = randsample(Xtrain, wtrain, true); % 对数据系列'X'进行自助重抽样,抽样元素数量为'how many elements',有放回抽样 rng('shuffle'); M(:,ii) = B; % 创建一个包含所有自助重抽样样本的矩阵,根据for循环创建的数量 [C,IA] = setdiff(Xtrain,B); % 创建一个包含未包含在自助样本'ii'中的'Xtrain'的所有元素的向量,以及每个元素的位置 [IAc] = setdiff(k,IA); % 创建一个包含在自助样本'ii'中使用的'Xtrain'元素位置的向量 --> ***IA + IAc = wtrain*** for j = 1:1:wtrain % 遍历每个向量的行 if ismember(j,IA)== 1 % 如果计数变量等于'IA'中的一个值 XC(j,ii) = Xtrain(j,1); % 如果上述语句为真,则将变量放入样本'ii'的矩阵中的位置'j' else XC(j,ii) = NaN; % 用NaN值保留位置,表示此值已在自助样本'ii'中使用 end dum1(:,ii) = wtrain - sum(isnan(XC(:,ii))); % 虚拟变量,允许通过'isnan'限制的'IAs'转置 --> 用于计算IA中元素的数量 dum2(:,ii) = sum(isnan(XC(:,ii))); % 虚拟变量,允许通过'isnan'限制的'IAsc'转置 IAs = transpose(dum1) ; % 变量计算在'M'中未被重新抽样的元素数量在集合'i'中,***即为每个重抽样集合'i'计算'IA' IAsc = transpose(dum2) ; % 变量计算在'M'中被重新抽样的元素数量在集合'i'中,***即为每个重抽样集合'i'计算'IAc' chk = isnan(XC); % 在NaN位置返回1,在实际值位置返回0 chks = sum(chk,2); % 计算训练时间集长度内每行中NaN的数量 chks_cnt = sum(chks(:)<(Blen-1)); % 计算原始时间序列中可以提供置信区间的值的数量,应等于wtrain以提供完整的CIs endend
回答:
这似乎不是randsample
的问题,而是您代码中的其他地方的问题。randsample
做得对。例如:
x = (1:10)';nSamples = 10;for iter = 1:100; data(:,iter) = randsample(x,nSamples ,true); end; hist(data(:)) %这大致是均匀分布的
randsample
抽样相当随机…