楼主: moonstone
4386 4

[程序分享] SAS中输出某一变量特征值的几种简单方法比较 [推广有奖]

讲师

74%

还不是VIP/贵宾

-

威望
0
论坛币
10442 个
通用积分
336.6055
学术水平
160 点
热心指数
169 点
信用等级
124 点
经验
263156 点
帖子
237
精华
1
在线时间
520 小时
注册时间
2007-4-27
最后登录
2024-4-11

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
运用SAS输出某一变量某一特征值(比如最小值,最大值,均值等等)的方法有多种,不同方法之间有细微的差别。现以最小值为例,简单举例比较几种常用方法的区别:

  1. data balances;
  2.   input custid $ bal1 bal2 bal3 bal4 bal5 bal6;
  3.   datalines;
  4. 12345  911.00  863.30  896.98 1672.26 1675.20  602.42
  5. 12346   62.27   10.28 1377.79 1683.42 1290.92  553.13
  6. 12347 1996.54   74.68  253.94  374.02  691.90  593.75
  7. 12348 1494.83 1114.74  332.76  505.95     .    963.98
  8. 12349  336.61  295.78  335.5  1965.40  592.76  664.7
  9. ;
  10. run;

  11. /*(1)采用data步中的min或smallest是以某一条观测为基础,寻找该观测的不同变量间取值最小的那个,而不是找某一个变量在所有观测中的最小值*/
  12. data balances2;
  13.    set balances;
  14.    minbal=min(of bal1-bal6); /*获取每个观测bal1-bal6中的最小值*/
  15.    large1=smallest(2,of bal1-bal6);  /*获取每个观测bal1-bal6中的第二个最小值*/
  16.    large2=smallest(3,of bal1-bal6);  /*获取每个观测bal1-bal6中的第三个最大值*/
  17.    put maxbal large1 large2;
  18. run;

  19. /*但是使用proc transpose转置一下,再用相同函数可以得到每个变量的最小值,不过这种办法有点曲线救国了*/

  20. proc transpose data=balances out=trans name=Test prefix=sn;
  21.    id custid;
  22. run;

  23. data balances3;
  24.    set trans;
  25.    minbal=min(of sn12345-sn12349); /*获取变量bal1-bal6中的最小值*/
  26.    put minbal;
  27. run;

  28. /*(2)采用SQL寻找某一个变量在所有观测中的最小值应该是最高效的方法*/
  29. proc sql;
  30. create table min1 as
  31. select min(bal1) as min_bal1
  32. from balances
  33. ;
  34. quit;

  35. proc print data=min1; var min_bal1; run;

  36. /*采用SQL在处理该问题的明显优势在于:可以同时定位该变量最小值所在的记录,这在数据清理中查询“异常值”非常有帮助*/

  37. proc sql;
  38. create table min1 as
  39. select custid, bal1
  40. from balances
  41. having bal1 = min(bal1)
  42. ;
  43. quit;

  44. proc print data=min1; run;

  45. /*(3)采用proc summary, proc univariate 也是另外一种寻找某一个变量最小值的可选的办法*/
  46. proc summary data=balances;
  47. var bal1;
  48. output out=sum1 min=min_bal1;
  49. run;

  50. proc print data=sum1;run;

  51. proc univariate data=balances;
  52. var bal1;
  53. output out=sum1 min=min_bal1;
  54. run;

  55. proc print data=sum1;run;

  56. /*proc univariate 同时还有另外一个特别的选项,nextrods, 可以同时输出多个最大最小的观测值,并输出相应的ID号,这对数据清理中发现异常值非常重要*/
  57. proc univariate data=balances nextrods=3;
  58. id custid;
  59. var bal1;
  60. run;


  61. /*(4)采用proc tabulate 也是另外一种备选的办法*/
  62. proc tabulate data=balances;
  63. var bal1;
  64. table bal1*(mean std min max median);
  65. keylabel mean='均值' std='标准差' min='最小值' max='最大值' median='中位数';
  66. run;

  67. /*(5)如果熟悉矩阵的话,当然也是可以采用的*/
复制代码


二维码

扫码加我 拉你入群

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

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

关键词:变量特征值 简单方法 特征值 Univariate Transpose 简单方法

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
eric_darcy + 1 + 1 + 1 精彩帖子

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

沙发
moonstone 发表于 2014-4-26 18:05:17 |只看作者 |坛友微信交流群
data 步虽然不能直接达到查询某一变量特征值的方法,但是采用proc transpose转置之后可以间接达到相同目的。

另外,proc univariate的nextrods选项其实是一个很好的工具,尤其对寻找极端值是非常有利的方法。

两种方法均已经在上述程序中进行更新。

使用道具

藤椅
congmu 发表于 2014-5-3 15:44:28 |只看作者 |坛友微信交流群
谢谢分享

使用道具

板凳
eric_darcy 发表于 2014-5-10 23:23:24 |只看作者 |坛友微信交流群
学习啦~再补充些proc summary, proc univariate 的详细解说。http://blog.163.com/qiaozhanwen@126/blog/static/12955392520128225952558/

http://blog.csdn.net/yugao1986/article/details/6329783

使用道具

报纸
moonstone 发表于 2014-5-11 20:25:24 |只看作者 |坛友微信交流群
eric_darcy 发表于 2014-5-10 23:23
学习啦~再补充些proc summary, proc univariate 的详细解说。http://blog.163.com/qiaozhanwen@126/blog/st ...
谢谢,^_^

使用道具

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

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

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

GMT+8, 2024-4-27 18:36