我计算了40只股票的比率。我需要根据比率的值将它们分为高,中,低三组。比率是一分之一,重复次数不多。我需要的是创建三组,每组约13只股票,第1组具有高比率,第2组中等比率和第3组低比率。我有以下代码,但它只是为我的所有股票分配等级1。 我怎么能纠正这个?
data sourceh.combinedfreq2;
merge sourceh.nonnfreq2 sourceh.nofreq2 sourcet.caps;
by symbol;
ratio=(freqnn/freq);
run;
proc rank data=sourceh.combinedFreq2 out=sourceh.ranked groups=3;
by symbol notsorted;
var ratio;
ranks rank;
run;
答案 0 :(得分:1)
如果要自动分区为三个相对均匀的组,可以使用PROC RANK(参见使用sashelp.stocks的示例):
data have;
set sashelp.stocks;
ratio=high/low;
run;
proc rank data=have out=want groups=3;
by stock notsorted;
var ratio;
ranks rank;
run;
将它们分成三组。只要你有40个不同的值(即,不是很多重复的一个值),它就会产生3个均匀分割的组(每组大约13个)。
在你的情况下,不要使用by
任何东西 - by
会创建单独的排名(这里我按股票排名日期,但你想对股票进行排名。)
答案 1 :(得分:0)
我认为人们正在变得比它需要的更复杂。让我们在简单模式下执行此操作。
首先,我们将创建数据集并创建比率。 其次,我们将按比例对数据进行排序。 最后,我们将根据观察编号分配一个组。
警告!未经编码的代码!
/*Make the dataset. I stole this from your code above*/
data sourceh.combinedfreq2;
merge sourceh.nonnfreq2 sourceh.nofreq2 sourcet.caps;
by symbol;
ratio=(freqnn/freq);
run;
/*sort the data so that its ordered by ratio*/
PROC SORT DATA=sourceh.combinedfreq2 OUT=sourceh.combinedfreq2 ;
BY DESCENDING ratio ;
RUN ;
/*Assign a value based on observation number*/
Data sourceh.combinedfreq2;
Set sourceh.combinedfreq2;
length Group $6.;
if _N_ <=13 Then Group = "High";
if _N_ > 13 and _N_ <= 26 Then Group = "Medium";
if _N_ > 26 Then Group = "Low";
run;