如何用给定数据集中的随机数替换超过阈值的值?

时间:2015-06-27 17:41:40

标签: matlab matrix random sample replacewith

我有一个名为'simulatedReturnsEVT3'的三维矢量。在该向量中,我想替换所有高于'MaxAcceptableVal'或低于'MinAcceptableVal'的值。超出这两个阈值之一的此类值应替换为从三维矢量“data2”中提取的随机数。为了绘制该随机数,我使用matlab函数'datasample'。

我编写了以下代码,该代码使用从'data2'中抽样的随机数替换超出任一阈值的值。然而,似乎(当在直方图中绘制数据时)替换发生沿着维度'j'的相同值。这不是我想要做的。对于每个阈值超出,我想要从'data2'中抽取一个新的随机数来替换。

nIndices = 19
nTrials  = 10000

% data2                has dimensions 782 x 19 x 10000
% simulatedReturnsEVT3 has dimensions 312 x 19 x 10000
% MaxAcceptableVal     has dimensions   1 x 19
% MinAcceptableVal     has dimensions   1 x 19

% Cut off Outliers
for i=1:nIndices
    for j=1:nTrials
        sliceEVT = simulatedReturnsEVT3(:,i,j);
        sliceEVT(sliceEVT < MinAcceptableVal(i))=datasample (data2(:,i,j), 1,1,'Replace',false);
        sliceEVT(sliceEVT > MaxAcceptableVal(i))=datasample (data2(:,i,j), 1,1,'Replace',false);
        simulatedReturnsEVT3(:,i,j) = sliceEVT;
    end
end

通过创建以下矩阵,可以在较小的范围内说明同样的问题。

% Set Maximum Acceptable Levels for Positive and Negative Returns
MaxAcceptableVal = [0.5   0.3]
MinAcceptableVal = [-0.5 -0.3]

simulatedReturnsEVT3 = [0.6 0.3; 0.3 0.3; 0.3 0.3; 0.3 0.4]
simulatedReturnsEVT3 = repmat(simulatedReturnsEVT3,[1 1 2])
data2                = [0.25 0.15; 0.25 0.15; 0.2 0.1]    
data2                = repmat(data2,[1 1 2])               

% Cut off Outliers
for i=1:2 
    for j=1:2 
        sliceEVT = simulatedReturnsEVT3(:,i,j);
        sliceEVT(sliceEVT < MinAcceptableVal(i))=datasample (data2(:,i,j), 1,1,'Replace',false);
        sliceEVT(sliceEVT > MaxAcceptableVal(i))=datasample (data2(:,i,j), 1,1,'Replace',false);
        simulatedReturnsEVT3(:,i,j) = sliceEVT;
    end
end

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

如果我已经理解了这个问题,那么它似乎与datasample的使用有关。

在您的代码中使用:

datasample (data2(:,i,j), 1,1,'Replace',false);

在此次通话中,第一个&#34; 1&#34;定义要提取的样本数量为&#34; 1&#34;。

如果必须在simulatedReturnsEVT3矩阵中替换多个值,则所有值都将被使用datasample提取的相同唯一数字替换

同样,如果我已经理解了这个问题,您应该通过指定数字&#34; datasample&#34;来呼叫n。需要使用值来替换绑定的&#34; simulatedReturnsEVT3

中的值
datasample (data2(:,i,:), n,1,'Replace',false)

为了测试这个解决方案,我修改了MaxAcceptableVal的定义,以便更多地使用&#34;更多&#34;价值观&#34;超出界限&#34;在simulatedReturnsEVT3

MaxAcceptableVal = [0.5   0.2]

这些是替换前simulatedReturnsEVT3的值:

val(:,:,1) =

    0.6000    0.3000
    0.3000    0.3000
    0.3000    0.3000
    0.3000    0.4000

val(:,:,2) =

    0.6000    0.3000
    0.3000    0.3000
    0.3000    0.3000
    0.3000    0.4000

这些是替换后的值:

val(:,:,1) =

    0.2500    0.1500
    0.3000    0.1000
    0.3000    0.1500
    0.3000    0.1000

val(:,:,2) =

    0.2000    0.1000
    0.3000    0.1500
    0.3000    0.1500
    0.3000    0.1000

这是更新的代码:

% Set Maximum Acceptable Levels for Positive and Negative Returns
% MaxAcceptableVal = [0.5   0.3]
MaxAcceptableVal = [0.5   0.2]
MinAcceptableVal = [-0.5 -0.3]

simulatedReturnsEVT3 = [0.6 0.3; 0.3 0.3; 0.3 0.3; 0.3 0.4]
simulatedReturnsEVT3 = repmat(simulatedReturnsEVT3,[1 1 2])
data2                = [0.2 0.1; 0.25 0.15; 0.25 0.15; 0.2 0.1]    
data2                = repmat(data2,[1 1 2])               

% Cut off Outliers
for i=1:2 
    for j=1:2 
        sliceEVT = simulatedReturnsEVT3(:,i,j)
% Identify the index of the values to be replaced
        idx=find(sliceEVT < MinAcceptableVal(i))
% Evaluate how many values have to be replaced        
        n=length(idx)
% Extract and assign  the number from "data2"        
        sliceEVT(idx)=datasample (data2(:,i,j), n,1,'Replace',false)

% Identify the index of the values to be replaced
        idx=find(sliceEVT > MaxAcceptableVal(i))
% Evaluate how many values have to be replaced        
        n=length(idx)
% Extract and assign  the number from "data2"        
        sliceEVT(idx)=datasample (data2(:,i,j), n,1,'Replace',false)

        simulatedReturnsEVT3(:,i,j) = sliceEVT
    end
end

希望这有帮助。