2015-06-27 30 views
1

我有一個叫做'simulatedReturnsEVT3'的3維向量。在該向量中,我想要替換所有高於「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

如果我理解了這個問題,它似乎與datasample的使用有關。

在你的代碼使用方法:

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

在此調用,第一個「1」定義要提取的是「1」樣本的數量。

如果不止一個值必須在simulatedReturnsEVT3矩陣進行更換,所有的人都通過西港島線使用提取datasample

同樣,如果我理解這個問題,你應該是相同的,唯一編號來代替調用datasample通過指定simulatedReturnsEVT3

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

數字「n」的需要的值替換「出結合的」值要測試此溶液我修改的MaxAcceptableVal定義爲了有「更「價值」o在simulatedReturnsEVT3結合」的UT:

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 

希望這有助於。

+0

非常感謝您的詳細回覆il_raffa。我相信你已經用datasample函數正確地識別了我的問題。但是,將代碼應用到我的數據集時,它仍會產生相同的問題。我現在決定繼續我的分析,並將離開這一步。再次感謝! – Carolin

相關問題