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

Matlab 如何用从给定数据集中采样的随机数替换超过阈值的值?,matlab,matrix,random,sample,replacewith,Matlab,Matrix,Random,Sample,Replacewith,我有一个叫做“simulatedReturnsEVT3”的三维向量。在该向量中,我想替换所有高于“MaxAcceptableVal”或低于“MinAcceptableVal”的值。超出这两个阈值的值应替换为从三维向量“data2”提取的随机数。为了绘制那个随机数,我使用了matlab函数“datasample” 我已经编写了下面的代码,它用从“data2”中采样的随机数替换超出任一阈值的值。但是,(在柱状图中绘制数据时)沿维度“j”的替换值似乎相同。这不是我想做的。对于每个超过阈值的情况,我希望

我有一个叫做“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
nIndices=19
NTRIAL=10000
%data2的尺寸为782 x 19 x 10000
%simulatedReturnsEVT3的尺寸为312 x 19 x 10000
%MaxAcceptableVal的尺寸为1 x 19
%MinAcceptableVal的尺寸为1 x 19
%截断异常值
对于i=1:nindice
对于j=1:n列
切片EVT=模拟的Returnsevt3(:,i,j);
sliceEVT(sliceEVTmaxaccessableval(i))=datasample(data2(:,i,j),1,1,'Replace',false);
simulatedReturnsEVT3(:,i,j)=切片EVT;
结束
结束
通过创建以下矩阵,同样的问题可以在更小的范围内得到说明

% 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
%设置正回报和负回报的最大可接受水平
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])
数据2=[0.25 0.15;0.25 0.15;0.20.1]
data2=repmat(data2[12])
%截断异常值
对于i=1:2
对于j=1:2
切片EVT=模拟的Returnsevt3(:,i,j);
sliceEVT(sliceEVTmaxaccessableval(i))=datasample(data2(:,i,j),1,1,'Replace',false);
simulatedReturnsEVT3(:,i,j)=切片EVT;
结束
结束

有人能帮忙吗?

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

在您的代码中使用:

datasample (data2(:,i,j), 1,1,'Replace',false);
在此调用中,第一个“
1
”定义了要提取的样本数,即“
1

如果必须在
simulatedReturnsEVT3
矩阵中替换多个值,则所有值都将替换为使用
datasample

同样,如果我理解了这个问题,您应该调用
datasample
,方法是指定值的编号“
n
”,以替换
simulatedReturnsEVT3

datasample (data2(:,i,:), n,1,'Replace',false)
为了测试这个解决方案,我修改了
MaxAcceptableVal
的定义,以便在
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
这些是更换后的值:

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
%设置正回报和负回报的最大可接受水平
%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])
数据2=[0.20.1;0.25 0.15;0.25 0.15;0.20.1]
data2=repmat(data2[12])
%截断异常值
对于i=1:2
对于j=1:2
sliceEVT=simulatedReturnsEVT3(:,i,j)
%确定要替换的值的索引
idx=查找(切片EVTMaxAcceptableVal(i))
%评估需要替换多少个值
n=长度(idx)
%从“数据2”中提取并分配数字
slicevt(idx)=数据样本(数据2(:,i,j),n,1,'Replace',false)
simulatedReturnsEVT3(:,i,j)=切片EVT
结束
结束

希望这能有所帮助。

非常感谢您的详细回复。我相信您已经正确地识别了我在datasample函数中的问题。但是,当将代码应用到我的数据集时,仍然会产生相同的问题。我现在决定继续我的分析,并将退出这一步。再次感谢!