楼主: shenshen0455
12008 26

[原创博文] 请教sas对于频数统计的问题,难!! [推广有奖]

  • 0关注
  • 1粉丝

博士生

6%

还不是VIP/贵宾

-

威望
0
论坛币
115 个
通用积分
1.6634
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
7722 点
帖子
291
精华
0
在线时间
136 小时
注册时间
2006-8-1
最后登录
2012-6-3
毕业学校
das

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
求助各位大虾
我收集了一批数据,共5个变量,共1300条记录。每个变量的取值为1-150
现在我想找出,这5个变量组合中,出现的频率最高的是哪一种组合?
请问用sas应该怎么编程呢,谢谢
我试了一些proc freq,但是由于变量较多,记录数较多,变量的分类也太多(1-150),sas软件没法算出结果
应该怎么弄呢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sas软件 freq 怎么编程 ROC 怎么弄 怎么编程 统计 记录 软件

回帖推荐

meishanjia1900 发表于5楼  查看完整内容

举个例子,你的原始数据集为your_data,其中有两个变量V1与V2。你想统计第一个变量V1中出现频率最高的数字,实现方法有很多,我想出来的方法是排序之后再用保留变量统计,完整程序如下: data your_data; input v1 v2; cards; 1 2 3 4 5 6 7 8 7 9 3 2 5 4 5 6 5 1 7 0 ; proc sort data=your_data(keep=v1) out=var1_data; by v1; run; data report_data; set var1_data; by v1; retain sum ...

shenshen0455 发表于6楼  查看完整内容

谢谢指点啊! 不过我这里是想求出组合频率的次数,比如你的数据中, 1 2 的组合出现1次,则频数为1 3 4的组合出现1次,频数为1 5 6的组合出现1次,频数为1 不知道我有没有说清楚呢 另外,如果变量取值为字符型的,这个程序也适用吗

本帖被以下文库推荐

沙发
zhuimengderen_ 发表于 2011-11-7 21:45:19 |只看作者 |坛友微信交流群
我是初学者,这些还不清楚呢

使用道具

藤椅
shenshen0455 发表于 2011-11-7 22:01:37 |只看作者 |坛友微信交流群
继续求教高手
aabbcc

使用道具

板凳
shenshen0455 发表于 2011-11-7 22:29:55 |只看作者 |坛友微信交流群
高手在哪里呢
aabbcc

使用道具

报纸
meishanjia1900 发表于 2011-11-7 22:36:27 |只看作者 |坛友微信交流群
举个例子,你的原始数据集为your_data,其中有两个变量V1与V2。你想统计第一个变量V1中出现频率最高的数字,实现方法有很多,我想出来的方法是排序之后再用保留变量统计,完整程序如下:

data your_data;
  input v1 v2;
cards;
1 2
3 4
5 6
7 8
7 9
3 2
5 4
5 6
5 1
7 0
;

proc sort data=your_data(keep=v1) out=var1_data;
  by v1;
run;

data report_data;
  set var1_data;
  by v1;
  retain sum maxfreq;
  if _n_=1 then maxfreq=0;
  if first.v1 then sum=0;
  sum=sum+1;
  if last.v1 then do;
    if sum>maxfreq then maxfreq=sum;
  end;
  call symput('maxfreq',maxfreq);
run;

data result_report;
  set report_data;
  if sum=&maxfreq;
  keep v1 maxfreq;
run;

proc print data=result_report;
run;

---------------------------------------------------------------------

结果是:

                    Obs    v1    maxfreq
                      1      5       4


---------------------------------------------------------------------

在变量V1中,出现频率最高的数字为5,出现的次数为4次。

运行良好,不是么?

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

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

使用道具

地板
shenshen0455 发表于 2011-11-7 22:53:34 |只看作者 |坛友微信交流群
谢谢指点啊!
不过我这里是想求出组合频率的次数,比如你的数据中,
1 2 的组合出现1次,则频数为1
3 4的组合出现1次,频数为1
5 6的组合出现1次,频数为1
不知道我有没有说清楚呢
另外,如果变量取值为字符型的,这个程序也适用吗
aabbcc

使用道具

7
meishanjia1900 发表于 2011-11-7 23:09:34 |只看作者 |坛友微信交流群
我懂你的意思了,你是说组合的频率,对么?

稍加改变即可:

data your_data;
  input v1 v2;
cards;
1 2
3 4
5 4
7 8
7 9
3 4
5 4
5 6
5 1
7 0
;

proc sort data=your_data out=var_data;
  by v1 v2;
run;

data report_data;
  set var_data;
  by v1 v2;
  retain sum maxfreq;
  first_num=0; last_num=0;
  if first.v1 or first.v2 then first_num=1;
  if last.v1 or last.v2 then last_num=1;
  if _n_=1 then maxfreq=0;
  if first_num=1 then sum=0;
  sum=sum+1;
  if last_num=1 then do;
    if sum>maxfreq then maxfreq=sum;
  end;
  call symput('maxfreq',maxfreq);
run;

data result_report;
  set report_data;
  if sum=&maxfreq;
  keep v1 v2 maxfreq;
run;

proc print data=result_report;
run;

------------------------------------------------------------------------------------------------

结果是:

                                     Obs    v1    v2    maxfreq
                                       1       3      4        2
                                       2       5      4        2


------------------------------------------------------------------------------------------------

考虑V1与V2的组合,结果显示:

组合(3,4)和组合(5,4)均出现2次,这个2次是最大出现次数。

使用道具

8
meishanjia1900 发表于 2011-11-7 23:15:46 |只看作者 |坛友微信交流群
字符就稍微复杂一点了,用排序法不见得可以做得通,得想其他的法子了。

我的SAS也不怎么样,字符类型的问题我也期待高手来解决。

使用道具

9
shenshen0455 发表于 2011-11-7 23:19:13 |只看作者 |坛友微信交流群
非常的感谢!
我的是5个变量,是不是就改动:
if first.v1 or first.v2 or first.v3 or first.v4 or first.v5 then first_num=1;
以及其它出现v1 v2 的地方就可以了?
请原谅我对sas的无知,衷心感谢你!
如果我除了要找出最大的组合及其频数,还要找出第2、第3的频数及其次数,需要调整哪个地方呢?
aabbcc

使用道具

10
meishanjia1900 发表于 2011-11-8 00:11:41 |只看作者 |坛友微信交流群
你说得对,比如对以下程序,除了改成first.v1 or first.v2 or ... first.v5之外,别忘了:

last.v1 or last.v2 or ... last.v5

另外:

by v1 v2  改为 by v1 v2 ... v5

(keep=v1 v2 sum) 改为 (keep=v1 v2 ... v5 sum)

至于找前三个较高频率数及其对应组合,程序如下:

data your_data;
  input v1 v2;
cards;
1 2
3 4
5 4
7 8
7 9
3 4
5 4
5 6
5 6
5 6
5 1
7 0
9 9
9 9
9 9
9 9
9 9
;

proc sort data=your_data out=var_data;
  by v1 v2;
run;

data report_data;
  set var_data;
  by v1 v2;
  retain sum;
  first_num=0; last_num=0;
  if first.v1 or first.v2 then first_num=1;
  if last.v1 or last.v2 then last_num=1;
  if first_num=1 then sum=0;
  sum=sum+1;
  if last_num=1;
run;

proc sort data=report_data(keep=v1 v2 sum) out=report_data;
  by descending sum;
run;

proc print data=report_data;
run;

----------------------------------------------------------------------------------------------------------

结果为:

                                       Obs    v1    v2    sum
                                        1       9      9      5
                                        2       5      6      3
                                        3       3      4      2
                                        4       5      4      2
                                        5       1      2      1
                                        6       5      1      1
                                        7       7      0      1
                                        8       7      8      1
                                        9       7      9      1


----------------------------------------------------------------------------------------------------------

SUM变量统计的是出现的频数,已经按频数从高到低排序了。

你只需要在前面数三个较高频数的组合即可!

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
shenshen0455 + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-5 20:32