在SAS中计算不同分组维度下个体平方偏差之和的方法咨询
SAS 多分组平方偏差总和实现方法
这里给你两种简单的实现思路,都能适配多分类变量的分组计算需求:
方案1:PROC SQL 窗口函数一步完成
不用单独先计算均值再拼接,通过窗口分区直接按对应分组匹配均值计算:
proc sql; create table want as select *, /* 按testid+level分组计算单观测平方偏差 */ (values - mean(values) over(partition by testid, level))**2 as sq_dev_by_testid_level, /* 按testid单独分组计算单观测平方偏差 */ (values - mean(values) over(partition by testid))**2 as sq_dev_by_testid, /* 按testid+level分组计算平方偏差总和 */ sum(calculated sq_dev_by_testid_level) over(partition by testid, level) as sum_sq_dev_by_testid_level, /* 按testid单独分组计算平方偏差总和 */ sum(calculated sq_dev_by_testid) over(partition by testid) as sum_sq_dev_by_testid from have; quit;
如果不需要保留单观测的平方偏差,只需要分组汇总结果,可以直接分组聚合计算:
proc sql; /* 按testid+level分组的平方偏差总和 */ create table sum_by_testid_level as select testid, level, sum((values - mean(values))**2) as sum_sq_dev from have group by testid, level; /* 按testid单独分组的平方偏差总和 */ create table sum_by_testid as select testid, sum((values - mean(values))**2) as sum_sq_dev from have group by testid; quit;
方案2:基于你已有的PROC MEANS结果计算
你已经跑出的class_stats数据集里默认包含了所有分类层级的汇总结果,只需要把不同层级的均值拆出来拼接回原数据集即可:
/* 拆分不同层级的均值 */ data mean_by_testid_level mean_by_testid; set class_stats; /* _TYPE_=3对应testid和level都非缺失的组合分组均值 */ if _TYPE_=3 then output mean_by_testid_level; /* _TYPE_=2对应仅按testid分组的均值 */ if _TYPE_=2 then output mean_by_testid; run; /* 拼接均值回原数据集并计算 */ data want; merge have mean_by_testid_level(keep=testid level values_mean rename=(values_mean=mean_testid_level)) mean_by_testid(keep=testid values_mean rename=(values_mean=mean_testid)); by testid level; /* 单观测平方偏差 */ sq_dev_testid_level = (values - mean_testid_level)**2; sq_dev_testid = (values - mean_testid)**2; run; /* 如需分组求和,再运行一次proc means即可 */ proc means data=want sum noprint; class testid level; var sq_dev_testid_level sq_dev_testid; output out=sum_stats sum= /autoname; run;
两种方案都可以得到你需要的结果,方案1代码更简洁,方案2更适配你已有的代码逻辑。
内容的提问来源于stack exchange,提问作者ACLAN
相关产品推荐
相关产品推荐

