SAS中文论坛

标题: 分组求平均的问题 [打印本页]

作者: shiyiming    时间: 2009-11-16 14:47
标题: 分组求平均的问题
我现有几个dataset,我想按照每个dataset中observation的个数平均分成10组,每组number of observation相同,然后每组求平均。

问题是:
每个dataset里observation N不太一样,如何用一个程序使得应用于所有dataset?

谢谢!
作者: shiyiming    时间: 2009-11-16 16:53
标题: Re: 分组求平均的问题
谢谢tanzhen_mysas的提醒,忘了nobs这个选项了
[code:1prwxruk]%macro group(inds,outds,group);
   data &outds(drop=interval);
      retain interval;
      set &inds nobs=nobs;
      if _n_=1 then interval=round(nobs/&group);
      group=int((_n_-1)/interval)+1;
   run;
%mend;

%group(sashelp.class,work.temp,10)[/code:1prwxruk]
作者: shiyiming    时间: 2009-11-16 17:42
标题: Re: 分组求平均的问题
唉,研究老半天没想到自己钻了牛角尖。len的计算方法参考的是HOPEWELL的,很简单,很强大。呵呵。
[code:2a95k85q]
dm 'log;clear;output;clear;';
data tmp;
        input row @@;
        datalines;
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5
;
run;

data tgt;
        intl=10;
        if int(nobs/intl)        =nobs/intl then len=nobs/intl;
        else len=int((nobs-1)/intl)+1;

        set tmp end=eof nobs=nobs;
        retain tgt 0 seq 1 i 0;
        tgt=sum(tgt,row);
        i+1;
        if _N_>1 then do;
                if mod(_N_-1,len)=0 then do;
                        tgt=row;
                        i=1;
                        seq=seq+1;
                end;
        end;
run;

[/code:2a95k85q]
作者: shiyiming    时间: 2009-11-16 18:13
标题: Re: 分组求平均的问题
这个intl是什么啊,run出来分了9组,并不是10组。

我自己琢磨了半天用了一个最笨的办法,把所有observation从1标到最后,然后用这个标号/total number of obs.,最后用这个<0.1,label为1,0.2-0.3 label为2,...。

我去学学这个len怎么用。
作者: shiyiming    时间: 2009-11-17 15:33
标题: Re: 分组求平均的问题
请问如果是按group分组,而按另一个变量NN=1的个数来分10个数据集该怎么办呢?
NN=1的观测在每个group中数量都是不同的。谢谢!
作者: shiyiming    时间: 2009-11-18 13:29
标题: Re: 分组求平均的问题
[code:1ktf8g2j]data new;         do x=1 to 23; output; end; run;
data new1;
do group=1 to 10;
        nGrp =ceil((nobs-n)/(11-group));
        do k =1 to nGrp;
                n +1;         output;
        end;
end;
set new nobs =nobs;
run;
data xx;  merge new1 new; run;
proc sql; select distinct group, nGrp, avg(x) as mean from xx group by group;
quit;[/code:1ktf8g2j]
关于分组的建议:如果N《10 没有意义;如果N不被10整除,如何均摊余数是个问题。我想如果n=11,那么一个组2个,九个组1个观察;如果n=23,那么三个组3个,七个组2个观察,如上所示,算是较均衡的方法吧
作者: shiyiming    时间: 2009-11-18 15:48
标题: Re: 分组求平均的问题
[quote="jingju11":2gykvuew][code:2gykvuew]data new;         do x=1 to 23; output; end; run;
data new1;
do group=1 to 10;
        nGrp =ceil((nobs-n)/(11-group));
        do k =1 to nGrp;
                n +1;         output;
        end;
end;
set new nobs =nobs;
run;
data xx;  merge new1 new; run;
proc sql; select distinct group, nGrp, avg(x) as mean from xx group by group;
quit;[/code:2gykvuew]
关于分组的建议:如果N《10 没有意义;如果N不被10整除,如何均摊余数是个问题。我想如果n=11,那么一个组2个,九个组1个观察;如果n=23,那么三个组3个,七个组2个观察,如上所示,算是较均衡的方法吧[/quote:2gykvuew]


太感谢了!我没说清楚,nn是双值变量可以是1,可以是0,每个group中观测数量不同,每个group中nn=1的观测数量不同。如果是把数据集平均分成四个,group不能被分,也就是一个group中的观测只能出现在一个数据集中,而平均是按nn=1的个数来算,而不是真正的平均的数据量。
目前我想到的办法是先用data步把nn=1的挑出来,然后再按整个的观测数平均分10组,但是group不能乱。那么这样该怎么办呢?因为group里观测有多有少,怎么能保证分的尽量平均呢?
作者: shiyiming    时间: 2009-11-18 16:22
标题: Re: 分组求平均的问题
要不这样行不行,把每个group的观测数统计出来,然后用线性规划求分10组后观测数量的最小标准差或者方差?问题是怎么做呢?另外有没有更好的方法呢?
作者: shiyiming    时间: 2009-11-18 22:15
标题: Re: 分组求平均的问题
做不出来。抱歉。
作者: shiyiming    时间: 2009-11-18 23:26
标题: Re: 分组求平均的问题
[quote="jingju11":2ktj9aea]做不出来。抱歉。[/quote:2ktj9aea]


您客气了 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
我刚刚想,也许我想的方法太笨。
设分文件变量为SN,retain sn 1
其实只要是分group统计观测数grpN,然后把所有观测数除以10得个平均数avg,然后依次累加group的观测数,当累加超过平均数,计算新加上的这个group后的观测数减去平均数avg是否大于二分之一的这个新加上的group的观测数,大于的话这个新加的group的观测的SN都都标为SN+1,其他标为SN,再加的开始标为SN+1,依次类推。
请问这个该怎么做呢?谢谢。
作者: shiyiming    时间: 2009-11-19 03:24
标题: Re: 分组求平均的问题
wow. quite complicated!
你有变量group, nn 和x。每个group 包含nn = 1 或者0.现在你想根据NN=1 的数量均分整个数据集。但是避免分开group。其实你给个数据最好。
作者: shiyiming    时间: 2009-11-19 11:49
标题: Re: 分组求平均的问题
nn其实可以不考虑了。到时候先选出来就行了。

group  x
1        5
1        64
1        17
1        31
1        84
1        78
2        43
2        79
2        26
2        13
3        51
3        15
4        81
4        95
4        13
4        15
4        3
4        97
4        64
4        92

然后想要(分两组的话,下划线为了格式上对齐,方便看)
group_x__grpN____N____sn   
1____5____6_______6___1      
1____64___6_______6___1      
1____17___6_______6___1      
1____31___6_______6___1      
1____84___6_______6___1      
1____78___6_______6___1
2____43___4_______10__1
2____79___4_______10__1
2____26___4_______10__1
2____13___4_______10__1
3____51___3_______13__2
3____15___3_______13__2
3____54___3_______13__2
4____81___8_______21__2
4____95___8_______21__2
4____13___8_______21__2
4____15___8_______21__2
4____3____8_______21__2
4____97___8_______21__2
4____64___8_______21__2
4____92___8_______21__2
作者: shiyiming    时间: 2009-11-20 00:44
标题: Re: 分组求平均的问题
Tricky!

问题是很难找到出一种好的方法去均分数据。也就是方法都很难满足即使是10个组的要求。问题不是如何编程而是什么的方法较好?
作者: shiyiming    时间: 2009-11-20 19:21
标题: Re: 分组求平均的问题
是啊,上面那个方法是想了一晚上才想出来的。
grpN方面,可以n+1的方式把每组多少观测弄出来,然后merge by group得到。
可是具体应该怎么编更简洁呢?谢谢指教。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2