You need to enable JavaScript to run this app. 在SAS中计算不同分组维度下个体平方偏差之和的方法咨询
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 10:18:14