SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 5354|回复: 13
打印 上一主题 下一主题

分组求平均的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-11-16 14:47:02 | 只看该作者

分组求平均的问题

我现有几个dataset,我想按照每个dataset中observation的个数平均分成10组,每组number of observation相同,然后每组求平均。

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

谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-11-16 16:53:26 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-11-16 17:42:25 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-11-16 18:13:56 | 只看该作者

Re: 分组求平均的问题

这个intl是什么啊,run出来分了9组,并不是10组。

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

我去学学这个len怎么用。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-11-17 15:33:07 | 只看该作者

Re: 分组求平均的问题

请问如果是按group分组,而按另一个变量NN=1的个数来分10个数据集该怎么办呢?
NN=1的观测在每个group中数量都是不同的。谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-11-18 13:29:27 | 只看该作者

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个观察,如上所示,算是较均衡的方法吧
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-11-18 15:48:18 | 只看该作者

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里观测有多有少,怎么能保证分的尽量平均呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-11-18 16:22:34 | 只看该作者

Re: 分组求平均的问题

要不这样行不行,把每个group的观测数统计出来,然后用线性规划求分10组后观测数量的最小标准差或者方差?问题是怎么做呢?另外有没有更好的方法呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-11-18 22:15:51 | 只看该作者

Re: 分组求平均的问题

做不出来。抱歉。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-11-18 23:26:42 | 只看该作者

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,依次类推。
请问这个该怎么做呢?谢谢。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 04:41 , Processed in 0.069086 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表