2016-12-22 10 views
0

Iは、次の606 X 274表有する下部及び上部20%パーセンタイルを計算し、結果に基づいて、2つの新しい変数を作成するすべての日付のランキング目的でPercentile関数を使用するにはどうすればよいですか? (Matlabの)

see here


目標を、例えば表のヘッダーに表示されるティッカー名を含む「lower」の場合は「L」、「upper」の場合は「U」。ステップバイ

ステップ:

% Replace NaNs with 'empty' for the percentile calculation (error: input to be cell array) 
    T(cellfun(@isnan,T)) = {[]} 
% Change date format 
    T.Date=[datetime(T.Date, 'InputFormat', 'eee dd-MMM-yyyy')]; 
% Take row by row 
    for row=1:606 
% If Value is in upper 20% percentile create new variable 'U' that contains the according ticker names. 
% If Value is in lower 20% percentile create new variable 'L' that contains the according ticker names. 
    end; 

これまでのところ、「prctile」で実験すると、単一列のみのため、数値の結果が得られました。例:

Y = prctile(T.A2AIM,20,2); 

ご協力いただきありがとうございます。

答えて

0

あなたは数字の配列を持っている場合、一般的に言えば:

a = [4 2 1 8 -2]; 

パーセンタイルは、最初の配列をソートして、パーセンタイルで供給されたインデックスにアクセスしようとすることにより計算することができます。だから、prctile(a,20)の機能は、原則的にはしかし、prctileが少ない配列のサイズに影響された値を取得するには、入力ベクトルを補間空想の魔法の少しを行い

b = sort(a); 
ind = round(length(b)*20/100); 
if ind==0 
    ind = 1; 
end 
b = b(ind); 
% b = -2 

置き換えることができます。ただし、上記の考え方を使用してパーセンタイル分割列を見つけることができます。上記のように選択した場合、20%パーセンタイルと80%パーセンタイルに対応するヘッダーを取得するには、行をループし、NaNを削除し、残っている値をソートします20パーセンタイルまたは80パーセンタイルの特定のインデックスを取得します。残念ながら、テーブルをサポートしていない古いバージョンのMatlabを使用しているため、ヘッダー名が正しく返されているかどうかを確認することはできませんでしたが、アイデアは明確にする必要があります。

L = cell(size(T,1),1); 
U = cell(size(T,1),1); 
for row=1:size(T,1) 
    row_values = T{row,:}; 
    row_values = row_values(2:end); % Remove date column 
    non_nan_indeces = find(~isnan(row_values)); 
    if not(isempty(non_nan_indeces)) 
     [row_values,sorted_indeces] = sort(row_values(non_nan_indeces)); 
     % The +1 is because we removed the date column 
     L_ind = non_nan_indeces(sorted_indeces(1:round(0.2*length(row_values))))+1; 
     U_ind = non_nan_indeces(sorted_indeces(round(0.8*length(row_values)):end))+1; 
     % I am unsure about this part 
     L{row} = T.Properties.VariableNames(L_ind); 
     U{row} = T.Properties.VariableNames(U_ind); 
    else 
     L{row} = nan; 
     U{row} = nan; 
    end 
end; 

あなたは、MATLABのprctileを使用したい場合は、返された値のインデックスは、このような何かやって見つける必要があります:あなたの入力、@lucianopazため

L = cell(size(T,1),1); 
U = cell(size(T,1),1); 
for row=1:size(T,1) 
    row_values = T{row,:}; 
    row_values = row_values(2:end); % Remove date column 
    non_nan_indeces = find(~isnan(row_values)); 
    if not(isempty(non_nan_indeces)) 
     [row_values,sorted_indeces] = sort(row_values(non_nan_indeces)); 
     L_val = prctile(row_values(non_nan_indeces),20); 
     U_val = prctile(row_values(non_nan_indeces),80); 
     % The +1 is because we removed the date column 
     L_ind = non_nan_indeces(sorted_indeces(find(row_values<=L_val)))+1; 
     U_ind = non_nan_indeces(sorted_indeces(find(row_values>=U_val)))+1; 
     % I am unsure about this part 
     L{row} = T.Properties.VariableNames(L_ind); 
     U{row} = T.Properties.VariableNames(U_ind); 
    else 
     L{row} = nan; 
     U{row} = nan; 
    end 
end; 
+0

おかげでたくさん!あなたの上位コードが動作しているようですが、それは奇妙なことに、日付ごとに1つだけティッカー名を返します。コードを調整して各日付の80%(および20%)パーセンタイルを超えるすべてのティッカーを返すように助けてください。事前に感謝します – John

+0

@ジョン、私は正しく理解していないと、20%未満または80%未満の値を持つすべての名前ではなく、20%のパーセンタイルまたは80%のパーセンタイルに等しい値を持つ変数名を取得したいと思った%。変数名のリストを取得するために両方のコードを編集しました。期待して助けてください – lucianopaz

+0

多くの感謝!私はあなたの助けに非常に感謝します! – John

関連する問題