Borrar filtros
Borrar filtros

Computing the median of a group except one member

1 visualización (últimos 30 días)
wy6622
wy6622 el 13 de Feb. de 2019
Comentada: wy6622 el 14 de Feb. de 2019
I have a dataset of a variable x for S seasons of the same J firms (not ordered). I'd like to compute for each firm in each season, the median of all other firms in that season. e.g. S=2, J=6, my dataset is
M=[1 2 3 6 5 4 2 3 4 1 5 6; 1 1 1 1 1 1 2 2 2 2 2 2; 2 4 6 5 7 8 3 7 5 7 5 3]'
First column is the firm index, second column the season, third column the x values for each firm in each season.
I am thinking something like
for i=1:size(M,1)/6
for j=6*i-5:6*i
M(j,4)=median(M(6*i-5:6*i,3));
end
end
but with the index of M(:,3) inside median() somehow telling MATLAB to exclude the jth entry of M(:,3)?
Thank you!
  8 comentarios
madhan ravi
madhan ravi el 14 de Feb. de 2019
ok did you get the answer to your question since you accepted the answer ?
wy6622
wy6622 el 14 de Feb. de 2019
It works for the most parts except the step where it tries to assign the computed median to the corresponding firm. The "row=..." row below returns 0's as opposed to the desired index.
M=[1 2 3 6 5 4 2 3 4 1 5 6; 1 1 1 1 1 1 2 2 2 2 2 2; 2 4 6 5 7 8 3 7 5 7 5 3]';
M(:,4)=0; %create column of zeros
num_seasons = unique(M(:,2)); %num of seasons
num_f = unique(M(:,1)); %num of firms
for i = 1:numel(num_seasons) % for each season...
season = M(M(:,2) == num_seasons(i),:); %matrix of season being iterated
for j = 1:numel(num_f) % for each firm...
med = median(season(not(season(:,1)==num_f(j)),3)); %median of OTHER firms for the season
disp(['Firm: ' num2str(num_f(j)) ' Season:' num2str(num_seasons(i)),...
' Median: ' num2str(med)]);
row = all(M(:,[1 2])==[num2str(num_f(j)) num2str(num_seasons(i))],2); %locate row where firm and season matches
M(row,4) = med; %append the median to the corresponding row, 4th col
end
end

Iniciar sesión para comentar.

Respuesta aceptada

Kevin Phung
Kevin Phung el 14 de Feb. de 2019
Hello!
Is this sort of what you're looking for?
M=[1 2 3 6 5 4 2 3 4 1 5 6; 1 1 1 1 1 1 2 2 2 2 2 2; 2 4 6 5 7 8 3 7 5 7 5 3]';
num_seasons = unique(M(:,2)); %num of seasons
num_f = unique(M(:,1)); %num of firms
for i = 1:numel(num_seasons) % for each season...
season = M(M(:,2) == num_seasons(i),:); %matrix of season being iterated
for j = 1:numel(num_f) % for each firm...
med = median(season(not(season(:,1)==num_f(j)),3)); %median of OTHER firms for the season
disp(['Firm: ' num2str(num_f(j)) ' Season:' num2str(num_seasons(i)),...
' Median: ' num2str(med)]);
end
end
  6 comentarios
Kevin Phung
Kevin Phung el 14 de Feb. de 2019
Just for the sake of following up with my mistake:
I made the mistake of converting the values into strings. row should have been:
row = all(M(:,[1 2])==[num_f(j) num_seasons(i)],2); %locate row where firm and season matches
so this should have worked:
M=[1 2 3 6 5 4 2 3 4 1 5 6; 1 1 1 1 1 1 2 2 2 2 2 2; 2 4 6 5 7 8 3 7 5 7 5 3]';
M(:,4)=0; %create column of zeros
num_seasons = unique(M(:,2)); %num of seasons
num_f = unique(M(:,1)); %num of firms
for i = 1:numel(num_seasons) % for each season...
season = M(M(:,2) == num_seasons(i),:); %matrix of season being iterated
for j = 1:numel(num_f) % for each firm...
med = median(season(not(season(:,1)==num_f(j)),3)); %median of OTHER firms for the season
row = all(M(:,[1 2])==[num_f(j) num_seasons(i)],2); %locate row where firm and season matches
M(row,4) = med; %append the median to the corresponding row, 4th col
end
end
use whichever method works best for you
wy6622
wy6622 el 14 de Feb. de 2019
Thank you again for your help.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Statistics and Machine Learning Toolbox en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by