楼主: gotobest
2734 6

SAS编程求斜率? [推广有奖]

  • 3关注
  • 1粉丝

硕士生

5%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
1060 点
帖子
61
精华
0
在线时间
117 小时
注册时间
2014-9-17
最后登录
2016-9-28

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
data a;
input time$16. intensity;
cards;
06OCT14:07:58:00 0.43
06OCT14:07:58:01 0.45
06OCT14:07:58:02 0.49
06OCT14:07:58:03 0.51
06OCT14:07:58:04 0.53
06OCT14:07:58:05 0.53
06OCT14:07:58:06 0.54
06OCT14:07:58:07 0.34
06OCT14:07:58:08 0.54
;
run;
找出intensity几个峰值,并求相邻最大值与最小值之间的斜率,即(intensity2-intensity1)/(time2-time1),SAS如何编程,恳请高手指教!

二维码

扫码加我 拉你入群

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

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

关键词:SAS编程 intensity cards Input Inte 最大值 如何

沙发
mingfeng07 学生认证  发表于 2014-11-25 00:57:41 |只看作者 |坛友微信交流群
  1. data a;
  2. input time datetime16. intensity;
  3. format time datetime16.;
  4. cards;
  5. 06OCT14:07:58:00 0.43
  6. 06OCT14:07:58:01 0.45
  7. 06OCT14:07:58:02 0.49
  8. 06OCT14:07:58:03 0.51
  9. 06OCT14:07:58:04 0.53
  10. 06OCT14:07:58:05 0.53
  11. 06OCT14:07:58:06 0.54
  12. 06OCT14:07:58:07 0.34
  13. 06OCT14:07:58:08 0.54
  14. ;
  15. run;
  16. data b;
  17. set a;
  18. intensity1=lag(intensity);
  19. if intensity1^=.;
  20. run;
  21. data c;
  22. set b;
  23. time=lag(time);
  24. intensity2=intensity;
  25. if time^=.;
  26. drop intensity;
  27. run;
  28. proc sql;
  29. create table d as select b.*,c.intensity2 from b,c where b.time=c.time;
  30. quit;
  31. data e;
  32. set d;
  33. if (intensity-intensity1)>0 and (intensity-intensity2)>0 then flag="极大值点";
  34. if (intensity-intensity1)<0 and (intensity-intensity2)<0 then flag="极小值点";
  35. if flag^='';
  36. run;
  37. data f;
  38. set e;
  39. retain int t;
  40. if _n_=1 then do;int=intensity;t=time;end;
  41. else do;t=time-t;int=intensity-int;end;
  42. k=int/t;
  43. if _n_=1 then k=.;
  44. keep time intensity flag k;
  45. run;
  46. proc sql;
  47. create table g as select a.*,f.flag,f.k from a left join f on a.time=f.time;
  48. quit;
复制代码

使用道具

藤椅
gotobest 发表于 2014-11-25 11:29:48 |只看作者 |坛友微信交流群
mingfeng07 发表于 2014-11-25 00:57
您这么晚还帮助我解决问题,非常感动也非常感谢!我受益匪浅!不过可以用lead和lag函数是不是更简洁一些,我写的程序如下:
data a;
input obs_time datetime16. intensity;
format obs_time datetime16.;
cards;
06OCT14:07:58:00 0.43
06OCT14:07:58:01 0.45
06OCT14:07:58:02 0.49
06OCT14:07:58:03 0.51
06OCT14:07:58:04 0.53
06OCT14:07:58:05 0.53
06OCT14:07:58:06 0.54
06OCT14:07:58:07 0.34
06OCT14:07:58:08 0.54
;
run;
proc expand data=a out=b method=none;

convert intensity = lead1 / transformout = (lead 1);
convert intensity = lag1 / transformout = (lag 1);
run;

data c;
set b;
if (intensity-lag1)>0 and (intensity-lead1)>0 then flag="极大值点";
if (intensity-lag1)<0 and (intensity-lead1)<0 then flag="极小值点";
if flag^='';
run;
proc sort data=c out=d;
by obs_time;
run;
data e;
set d;
slp=dif(intensity)/dif(obs_time);
run;
欢迎提宝贵建议!

使用道具

板凳
gotobest 发表于 2014-11-25 11:29:49 |只看作者 |坛友微信交流群
mingfeng07 发表于 2014-11-25 00:57
您这么晚还帮助我解决问题,非常感动也非常感谢!我受益匪浅!不过可以用lead和lag函数是不是更简洁一些,我写的程序如下:
data a;
input obs_time datetime16. intensity;
format obs_time datetime16.;
cards;
06OCT14:07:58:00 0.43
06OCT14:07:58:01 0.45
06OCT14:07:58:02 0.49
06OCT14:07:58:03 0.51
06OCT14:07:58:04 0.53
06OCT14:07:58:05 0.53
06OCT14:07:58:06 0.54
06OCT14:07:58:07 0.34
06OCT14:07:58:08 0.54
;
run;
proc expand data=a out=b method=none;

convert intensity = lead1 / transformout = (lead 1);
convert intensity = lag1 / transformout = (lag 1);
run;

data c;
set b;
if (intensity-lag1)>0 and (intensity-lead1)>0 then flag="极大值点";
if (intensity-lag1)<0 and (intensity-lead1)<0 then flag="极小值点";
if flag^='';
run;
proc sort data=c out=d;
by obs_time;
run;
data e;
set d;
slp=dif(intensity)/dif(obs_time);
run;
欢迎提宝贵建议!

使用道具

报纸
gotobest 发表于 2014-11-25 11:30:29 |只看作者 |坛友微信交流群

data a;
input obs_time datetime16. intensity;
format obs_time datetime16.;
cards;
06OCT14:07:58:00 0.43
06OCT14:07:58:01 0.45
06OCT14:07:58:02 0.49
06OCT14:07:58:03 0.51
06OCT14:07:58:04 0.53
06OCT14:07:58:05 0.53
06OCT14:07:58:06 0.54
06OCT14:07:58:07 0.34
06OCT14:07:58:08 0.54
;
run;
proc expand data=a out=b method=none;

convert intensity = lead1 / transformout = (lead 1);
convert intensity = lag1 / transformout = (lag 1);
run;

data c;
set b;
if (intensity-lag1)>0 and (intensity-lead1)>0 then flag="极大值点";
if (intensity-lag1)<0 and (intensity-lead1)<0 then flag="极小值点";
if flag^='';
run;
proc sort data=c out=d;
by obs_time;
run;
data e;
set d;
slp=dif(intensity)/dif(obs_time);
run;

使用道具

地板
teqel 发表于 2014-11-25 11:56:52 |只看作者 |坛友微信交流群
gotobest 发表于 2014-11-25 11:30
data a;
input obs_time datetime16. intensity;
format obs_time datetime16.;
这个不错

使用道具

7
mingfeng07 学生认证  发表于 2014-11-25 12:04:31 |只看作者 |坛友微信交流群
gotobest 发表于 2014-11-25 11:29
您这么晚还帮助我解决问题,非常感动也非常感谢!我受益匪浅!不过可以用lead和lag函数是不是更简洁一些, ...
恩,你这个采用了expand过程步更方便,而且使用了dif函数更有效率。

使用道具

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

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

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

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