2

我正在处理水文时间序列数据,并且正在尝试构建 Bootstrap 人工神经网络模型。为了使用置信区间提供不确定性评估,必须确保在重新采样/引导原始时间序列数据集时,原始时间序列中的每个值在所有引导样本中至少保留两次,以便计算方差和那个时间点的置信区间。

提供一些背景:

我正在使用一个包含每月时间步长的标准降水指数值的水文时间序列,这个时间序列跨越 429(行)x 1(列),我们称之为时间序列向量X。的所有元素/值在X和 之间进行标准化和0标准化1

X然后针对神经网络中的一些目标值(与 相同的长度和条件)训练时间序列X,以生成对目标值的新估计,我们称之为输出向量O(与 相同的长度和条件X)。

我现在要对其进行X重新采样ii =1:1:200(即 Bootstrap size = 200)以替换长度(429)。让我们将放置所有引导样本的矩阵称为M。我使用B = randsample(X, length(X), true)并使用 for 循环进行填充M,这样M(:,ii) = B. 注意:我还确保rng('shuffle')在我的randsample声明之后加入,以保持 RNG 移动到新状态,希望它能提供更多随机结果。

现在我要测试我的数据被重新采样以用于创建置信区间的“好坏”程度。

我的程序如下:

  1. 使用上述过程生成一个 for 循环以创建 M
  2. 创建一个新变量Xc,这将保存所有X未在引导示例中重新采样的值ii for ii = 1:1:200
  3. For j=1:1:length(X) fill 'Xc' using the Xc(j,ii) = setdiff(X, M(:,ii)),如果元素j存在,则用M(:,ii)填充。Xc(j,ii)NaN
  4. Xc现在是一个与 大小和维度相同的矩阵M。计算NaN每行中值的数量Xc并将其放入 vector 中CI
  5. 如果 中的任何行CI> [Bootstrap sample size, for this case (200) - 1],则此时无法创建置信区间。

当我运行它时,我发现从我的集合 X 中选择的值几乎总是重复的,即相同的值X用于生成 中的所有样本M。它与我的原始时间序列中的大约 200 个数据点大致相同,这些数据点总是被选择来创建新的引导样本。

我怎样才能有效地改变我的程序或使用任何特定的功能来避免(5)中的负面解决方案?

这是我的代码示例,但请记住,脚本中使用的变量可能与我在此处的文本不同。

感谢您的帮助,请参阅下面的代码。

for ii = 1:1:Blen % for loop to create 'how many bootstraps we desire'
    B = randsample(Xtrain, wtrain, true); % bootstrap resamples of data series 'X' for 'how many elements' with replacement
    rng('shuffle');
    M(:,ii) = B; % creates a matrix of all bootstrap resamples with respect to the amount created by the for loop
    [C,IA] = setdiff(Xtrain,B); % creates a vector containing all elements of 'Xtrain' that were not included in bootstrap sample 'ii' and the location of each element
    [IAc] = setdiff(k,IA); % creates a vector containing locations of elements of 'Xtrain' used in bootstrap sample 'ii' --> ***IA + IAc = wtrain***

    for j = 1:1:wtrain % for loop that counts each row of vector
            if ismember(j,IA)== 1 % if the count variable is equal to a value of 'IA'
                XC(j,ii) = Xtrain(j,1); % place variable in matrix for sample 'ii' in position 'j' if statement above is true
            else
                XC(j,ii) = NaN; % hold position with a NaN value to state that this value has been used in bootstrap sample 'ii'
            end
            dum1(:,ii) = wtrain - sum(isnan(XC(:,ii))); % dummy variable to permit transposing of 'IAs' limited by 'isnan' --> used to calculate amt of elements in IA
            dum2(:,ii) = sum(isnan(XC(:,ii))); % dummy variable to permit transposing of 'IAsc' limited by 'isnan' 
            IAs = transpose(dum1) ; % variable counting amount of elements not resampled in 'M' at set 'i', ***i.e. counts 'IA' for each resample set 'i'
            IAsc = transpose(dum2) ; % variable counting amount of elements resampled in 'M' at set 'i', ***i.e. counts 'IAc' for each resample set 'i'
            chk = isnan(XC); % returns 1 in position of NaN and 0 in position of actual value
            chks = sum(chk,2); % counts how many NaNs are in each row for length of time training set
            chks_cnt = sum(chks(:)<(Blen-1)); % counts how many values of the original time series that can be provided a confidence interval, should = wtrain to provide complete CIs
    end
end
4

1 回答 1

0

这似乎不是 randsample 的问题,而是您的其他代码中的问题。randsample 做正确的事。例如:

x = (1:10)';
nSamples = 10;
for iter = 1:100; 
   data(:,iter) =  randsample(x,nSamples ,true); 
end; 

hist(data(:)) %this is approximately uniform

randsample 样本非常随机......

于 2012-12-12T02:29:46.840 回答