楼主: kidzhang
22941 17

SAS中算术平均值的计算及调用 [推广有奖]

  • 8关注
  • 0粉丝

硕士生

31%

还不是VIP/贵宾

-

威望
0
论坛币
44 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1669 点
帖子
79
精华
0
在线时间
201 小时
注册时间
2010-9-17
最后登录
2021-8-5

楼主
kidzhang 发表于 2011-7-30 11:10:23 |AI写论文
50论坛币
各位大侠,帮小生看看吧,在这儿先谢过了~
我这儿有两个问题,比如有这样的数据,
data test ;                                                                                                                           
input m1 m2 m3;                                                                                                                        
cards;                                                                                                                                 
1.1 1.24 1.25                                                                                                                           
1.2 1.23 1.27                                                                                                                           
1.1 1.22 1.25                                                                                                                           
1.3 1.22 1.27                                                                                                                           
1.1 1.24 1.25  
1.3 1.25 1.25
1.3 1.27 1.26
1.2 1.31 1.26                                                                                                                        
;                                                                                                                                       
proc print;                                                                                                                             
run;
问题是这样的,1.如果我在后面的程序中要算m1-m1均值,m2-m2均值,m3-m3均值,应该怎么写程序呢?
2.怎样算1~3,2~4,3~5,4~6,5~7,6~8组(行)数据的m1,m2,m3的均值呢?同样的怎么算1~5,2~6,3~7,4~8组(行)数据的m1,m2,m3的均值呢?
初学SAS,找了很多书但也找不到答案,希望大家帮帮忙,谢谢啦~

关键词:算术平均值 平均值 希望大家帮帮忙 print 初学sas 算术平均值 移动平均值

回帖推荐

numman 发表于3楼  查看完整内容

1.2. 此处介绍两种方法: 一、二、此处为便于理解,就不使用宏了 方法一:主要是把数据进行转至后,利用变量名的规律求均值 方法二:用lag函数把需要求均值的数放在一行

本帖被以下文库推荐

沙发
yugao1986 发表于 2011-7-30 13:27:08
  1. /*m1-m3所有观测值的平均值*/
  2. proc means data=test mean;
  3. var m1-m3;
  4. output out=dmean(drop=_:) mean=mm1 mm2 mm3;
  5. run;

  6. /*m1-m3的1~3...6~8行平均值,同理1~5...4~8行平均值修改相关参数 */
  7. %macro rollingmean;
  8. proc datasets lib=work ;
  9. delete stats;
  10. quit;
  11. %do start=1 %to 6;
  12. proc means data=test(firstobs=&start obs=%eval(&start+2));
  13. var m1-m3;
  14. output out=temp(drop=_:) mean=mm1 mm2 mm3 ;
  15. run;
  16. proc append base=stats data=temp;
  17. run;
  18. %end;
  19. %mend;

  20. options nomprint nonotes;
  21. %rollingmean;

  22. options notes;
复制代码
三人行必有我师

藤椅
numman 发表于 2011-7-30 13:31:01
1.
  1. proc sql;
  2.                   create table all_avg as
  3.                    select   avg(m1) as m1_avg
  4.                                  ,avg(m2) as m2_avg
  5.                                  ,avg(m3) as m3_avg
  6.                    from  test
  7.                ;
  8.            quit;
复制代码
2.
此处介绍两种方法:
一、
  1. proc transpose data=test out=test2;                                                                                                   
  2.    run;                                                                                                                                 
  3.                                                                                                                                        
  4. proc sql noprint;                                                                                                                       
  5.         select count(*) into: n                                                                                                         
  6.         from test                                                                                                                       
  7. ;                                                                                                                                       
  8. quit;                                                                                                                                   
  9. %put &n;                                                                                                                                
  10.                                                                                                                                        
  11. %macro aa();                                                                                                                           
  12. data test3;                                                                                                                           
  13.         set test2 nobs=nn;                                                                                                              
  14.         %do i=1 %to %eval(&n.-2);                                                                                                      
  15.         avg_&i._%eval(&i.+2)=mean(of col&i.-col%eval(&i.+2));                                                                           
  16.         %end;                                                                                                                           
  17. run;                                                                                                                                    
  18.                                                                                                                                        
  19. %mend;                                                                                                                                 
  20. %aa;                                                                                                                                    
  21.                                                                                                                                        
  22. proc transpose data=test3 out=test4;                                                                                                   
  23. run;                                                                                                                                    
  24.                                                                                                                                        
  25. data test5;                                                                                                                             
  26.         set test4(firstobs=9);                                                                                                         
  27. run;
复制代码
二、此处为便于理解,就不使用宏了
方法一:主要是把数据进行转至后,利用变量名的规律求均值
方法二:用lag函数把需要求均值的数放在一行
  1. data test2;                                                                                                                             
  2.         set test;                                                                                                                       
  3.         m1_lag1=lag(m1);                                                                                                               
  4.         m1_lag2=lag(m1_lag1);                                                                                                           
  5.         m2_lag1=lag(m2);                                                                                                               
  6.         m2_lag2=lag(m2_lag1);                                                                                                           
  7.         m3_lag1=lag(m3);                                                                                                               
  8.         m3_lag2=lag(m3_lag1);                                                                                                           
  9.         if _n_>2 then do;                                                                                                               
  10.         m1_avg=mean(m1,m1_lag1,m1_lag2);                                                                                                
  11.         m2_avg=mean(m2,m2_lag1,m2_lag2);                                                                                                
  12.         m3_avg=mean(m3,m3_lag1,m3_lag2);                                                                                                
  13.         end;                                                                                                                           
  14. run;                                                                                                                                    
  15.                                                                                                                                        
  16. data test3;                                                                                                                             
  17.         set test2(firstobs=3);                                                                                                         
  18.         keep m1_avg m2_avg m3_avg;                                                                                                      
  19. run;
复制代码
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

板凳
fzcoolbaby 发表于 2011-7-30 13:56:33
%macro d;
%do i=3 %to 8;
     data d&i;
         set test;
             if _n_<=&i and _n_>=(&i-2);
     run;
         proc means data=d&i noprint;
              var m1-m3;
                  output out=q&i mean=mean_m1 mean_m2 mean_m3;
         run;
%end;
         data avg;
            set
            %do i=3 %to 8;
                    d&i
                %end;
                ;
          run;
proc print data=avg;
run;
%mend d;
%d

报纸
李金玲 发表于 2011-7-30 14:15:46
希望是你需要的!
*算平均值;
proc sql;
select mean(m1),mean(m2),mean(m3)
from test;
quit;


*平滑均值的计算;

data test;
set test;
format sum1 sum2 sum3 8.2;
retain sum1        sum2 sum3;
sum1+m1;
sum2+m2;
sum3+m3;
run;


data test2;
merge test(keep=sum1 sum2 sum3)
      test( firstobs=4 rename=(sum1=sum1a sum2=sum2a sum3=sum3a) keep=sum1 sum2 sum3);
means1=        (sum1a-sum1) /3;
means2=        (sum2a-sum2) /3;
means3=        (sum3a-sum3) /3;
run;


*后滞平均值;
%macro test(data=,n=,var=);
data test2;
format means sum 8.2;
set &data;

means=0;
sum=0;

%do i =1 %to %eval(&n.-1);
sum=sum+lag&i(&var);
%end;

sum=sum+&var;

if _n_ >= &n.  then means=sum/&n;
else means=.;
run;
%mend;
%test(data=test,n=5,var=m3)
李经纶

地板
kidzhang 发表于 2011-7-30 14:45:29
那请问算出均值以后,在后面的程序可以调用吗?怎么调用呢? 5# 李金玲

7
kidzhang 发表于 2011-7-30 15:09:02
numman先生你好!那请问第一步得到的m1_avg,m2_avg,可以直接在data ALL_avg中调用吗?我在下面试着加了一句,通不过,汗~
data test;                                                                                                                              
input m1 m2 m3;                                                                                                                        
cards;                                                                                                                                 
1.1 1.24 1.25                                                                                                                           
1.2 1.23 1.27                                                                                                                           
1.1 1.22 1.25                                                                                                                           
1.3 1.22 1.27                                                                                                                           
1.1 1.24 1.25                                                                                                                           
1.3 1.25 1.25                                                                                                                           
1.3 1.27 1.26                                                                                                                           
1.2 1.31 1.26                                                                                                                           
;                                                                                                                                       
                                                                                                                           
run;                                                                                                                                    
proc sql;                                                                                                                              
                                                                                                                                       
                  create table all_avg as                                                                                               
                                                                                                                                       
                   select   avg(m1) as m1_avg                                                                                          
                                                                                                                                       
                                 ,avg(m2) as m2_avg                                                                                    
                                                                                                                                       
                                 ,avg(m3) as m3_avg                                                                                    
                                                                                                                                       
                   from  test                                                                                                           
                                                                                                                                       
               ;                                                                                                                        
                                                                                                                                       
data new;                                                                                                                              
input x y z ;                                                                                                                           
x=m1-m1_avg;                                                                                                                           
y=m2-m2_avg;                                                                                                                           
z=m3-m3_avg;                                                                                                                           
proc print data=new;                                                                                                                             
run;               
3# numman

8
李金玲 发表于 2011-7-30 15:56:24
6# kidzhang 你是要把求得的平均数放到数据集里?还是宏变量里?
如果是数据集,你可以直接调用numman的all_avg 数据集!如果是宏变量,使用call symput!
李经纶

9
jasonscut 在职认证  发表于 2011-8-1 02:59:03

这么多厉害的高手!

咱们要好好学习!

北美统计金融博士

10
yugao1986 发表于 2011-8-1 08:22:35
时间序列中有proc expand语句,该语句可以解决滚动统计量,而且很方便。
三人行必有我师

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 00:30