SAS中数值变量的共自同构化

SAS中数值变量的共自同构化,sas,percentile,categorization,Sas,Percentile,Categorization,我想找到构建另一个变量的方法(即使在同一个数据集中也是可以的),即旧变量的分类。我会选择桶的数量(例如,使用百分位数作为截止值:p10、p20、p30,等等)。 现在我用proc-univariate提取变量的百分位数。但这只会给我百分位数(我的截止值),然后我必须使用百分位数手动构建新变量。 如何创建这个新变量,将截止值和桶数作为输入 提前感谢假设您想要相同百分比大小的桶,那么PROC RANK可能正好满足您想要的 data test; do i=1 to 100; output; end;

我想找到构建另一个变量的方法(即使在同一个数据集中也是可以的),即旧变量的分类。我会选择桶的数量(例如,使用百分位数作为截止值:
p10、p20、p30
,等等)。 现在我用
proc-univariate
提取变量的百分位数。但这只会给我百分位数(我的截止值),然后我必须使用百分位数手动构建新变量。 如何创建这个新变量,将截止值和桶数作为输入


提前感谢

假设您想要相同百分比大小的桶,那么
PROC RANK
可能正好满足您想要的

data test;
do i=1 to 100;
 output;
end;
run;

proc rank data=test out=test2 groups=5;
var i;
ranks grp;
run;
这将给你5个组(命名为0..4),这应该相当于P20,P40,…,P80截止值

如果您想要不相等的存储桶,即P10、P40、P60和P90,则必须选择最低级别并合并组。使用上述组:

%let groups=10;

proc rank data=test out=test2 groups=&groups;
var var;
ranks grp;
run;

/*
    P = (grp+1)*&groups
    Cutoffs 10, 40, 60, 90
    implicit 5 new groups
*/

%let n_cutoff=4;
%let cutoffs=10, 40, 60, 90;

data test3(drop=_i cutoffs:);
set test2;
array cutoffs[&n_cutoff] (&cutoffs);

P = (grp+1)*&groups;

do _i=1 to &n_cutoff;
    if P <= cutoffs[_i] then do;
        new_grp = _i-1;
        leave;
    end;

    if _i = &n_cutoff then
        new_grp = _i;
end;

run;
%let group=10;
proc rank data=test out=test2 groups=&groups;
var;
等级grp;
跑
/*
P=(grp+1)*&组
截止值10、40、60、90
新增5组
*/
%设n_截止=4;
%设截止值=10,40,60,90;
数据测试3(下降=截止值:);
设置test2;
阵列截止[&n_截止](&cutoffs);
P=(grp+1)*&组;
do _i=1至&n_截止点;

如果你愿意,谢谢。可能proc rank和groups=10是可以的。但我不知道为什么与proc单变量输出的分类相比,许多观察结果会被放在不同的桶中。@Giacomorospina您的数据集中有很多联系吗?@Reeza我不知道什么是联系变量我在您的实际数据中有重复的值或联系。关系是相同的值。在这种情况下,您的队伍可能不会创建完全相等的组,不同的过程可能会以不同的方式处理关系。