I built a function for outliers detection and it worked quite well, but given the huge amount of data I'm working on I needed to remove the "for loop", so here we have the vectorized version (or at least what I think is a vectorized version of my code). Calling the function the following parameters are intialized by the user, I am working with the following:
alpha=3
gamma=0.5
k=5
The series "price" exist in the workspace, is linked when calling the function.
I think I almost did it but I am stuck with a problem.
Here is a piece of the code:
[n] = size(price,1);
x = price;
[j1]=find(x); %output is a column vector with size (n,1) of the following form j1=[1:1:n]
matrix_left=zeros(n, k,'double');
matrix_right=zeros(n, k,'double');
toc
matrix_left(j1(k+1:end),:)=x(j1-k:j1-1);
%Here it returns the following error: Subscript indices must either be real positive integers or logicals.
matrix_right(j1(1:end-k),:)=x(j1+1:j1+k);
%Here, it says the following: Subscripted assignment dimension mismatch.
matrix_group=[matrix_left matrix_right];
trimmed_mean=trimmean(matrix_group,10,'round',2);
score=bsxfun(@minus,x,trimmed_mean);
sd=std(matrix_group,2);
temp = abs(score) > (alpha .* sd + gamma);
outmat = temp*1;
What I'd like to have is something like:
if k= 5
left_matrix (3443,5):
[100.25 103.5 102.25 102.75 103] <---5 left neighbouring observations of the 15th row of **x**
[103.5 102.25 102.75 103 103.5] <---5 left neighbouring observations of the 16th row of **x**
right_matrix(3443,5):
[103.75 104.25 104 104.75 104.25] <---5 right neighbouring observations of the 15th row of **x**
[104.25 104 104.75 104.25 104.5] <---5 right neighbouring observations of the 16th row of **x**
Here is a small sample of data:
x = Price; price size = (3443, 1)
[...]
100.25 %// '*suppose here we are at the 10th row*'
103.5
102.25
102.75
103
103.5 %// '*here we are at the 15th row*'
103.75
104.25
104
104.75
104.25
104.5
[...]
Time (3443,1) %// the same as price, it reports the time of the transaction (HH:MM:SS).
j1 (3443,1)
1
2
[...]
3442
3443
Thanks everyone in advance,
Giorgio