楼主: tangliang0905
1555 7

构建数列的一个问题 [推广有奖]

  • 1关注
  • 3粉丝

讲师

52%

还不是VIP/贵宾

-

威望
0
论坛币
1167 个
通用积分
1.0083
学术水平
13 点
热心指数
20 点
信用等级
11 点
经验
30311 点
帖子
212
精华
0
在线时间
834 小时
注册时间
2012-11-29
最后登录
2018-12-11

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
最近有一个关于怎样构建数列的问题。
比如最普遍的就是 fibonacci 数列
data fibo;
do i = 1 to 10;
    fib = sum(fib, lag(fib));
    if i eq 1 then fib = 1;
    output;
    end;
run;
proc print data=fibo;
run;
我的问题就是如果我的数列是基于某几个预定值的话,比如我的数据是data new;
input x;
datalines;
1
3
7
;
我想要得到的第四个数据是
y = 0.5*lag(x)+0.3*lag2(x)+0.2*lag3(x),
以此类推。这个问题的难点是从第四个x开始已经是空值了,所以也就是借用了前三个x的值,生成第四个x也就是第一个y值,然后第二个y值应该是由第一个y值,加上第三个x值,以及第二个x值来得到,以此类推,也就是用y值来得到y值本身
所以我期待得到的数列是
y
1
3
7
3.5+0.9+0.2=4.6
2.3+2.1+0.6=5
2.5+1.38+1.4=5.28



希望得到大家的帮助,谢谢

二维码

扫码加我 拉你入群

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

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

关键词:Fibonacci output outpu Input Lines

回帖推荐

bobguy 发表于4楼  查看完整内容

It can be simple as below. %let n=10; data tmp; array x(&n) _temporary_ (1,3,7); do i=1 to &n; if i

mingfeng07 发表于2楼  查看完整内容

沙发
mingfeng07 学生认证  发表于 2014-11-14 00:27:53 |只看作者 |坛友微信交流群
  1. data new;
  2. input x;
  3. datalines;
  4. 1
  5. 3
  6. 7
  7. ;
  8. run;
  9. %macro test(n);
  10. proc transpose data=new out=test;run;
  11. data test;
  12. set test;
  13. array a{*} col1-col&n.;
  14. do i=4 to dim(a);
  15. a(i)= 0.5*a(i-1)+0.3*a(i-2)+0.2*a(i-3);
  16. end;
  17. run;
  18. proc transpose data=test out=want(drop=_name_);
  19. var col1-col&n.;
  20. id _name_;
  21. run;
  22. %mend;
  23. %test(10000)
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
tangliang0905 + 5 + 2 + 2 + 2 精彩帖子

总评分: 论坛币 + 5  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

藤椅
tangliang0905 发表于 2014-11-14 02:43:58 |只看作者 |坛友微信交流群
十分感谢,我一直想着从纵向来解决这个问题,原来从横向就可以解决!

使用道具

板凳
bobguy 发表于 2014-11-15 00:53:32 |只看作者 |坛友微信交流群
It can be simple as below.

%let n=10;

data tmp;
array x(&n) _temporary_ (1,3,7);
do i=1 to &n;
   if i<=3 then ;
   else x[i] = 0.5*x[i-1]+0.3*x[i-2]+0.2*x[i-3];
   y=x[i];
   output;
end;
run;

proc print;run;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
tangliang0905 + 5 + 2 + 2 + 2 精彩帖子

总评分: 论坛币 + 5  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

报纸
tangliang0905 发表于 2014-11-15 02:52:08 |只看作者 |坛友微信交流群
bobguy 发表于 2014-11-15 00:53
It can be simple as below.

%let n=10;
不好意思,我领会错你的意思了,我再次运行一次以后出来想要的结果了。
The SAS System


i y
1 1.0000
2 3.0000
3 7.0000
4 4.6000
5 5.0000
6 5.2800
7 5.0600
8 5.1140
9 5.1310
10 5.1117

十分感谢!!!
但是,我还有一个问题,就是array的时候,你已经定义了前三个数字是1,3,7,但是如果碰到需要调用的情况,应该怎么办呢?因为前三个数字也许是2,4,8,也可能是3,5,9,有其他的方法吗?再次感谢

使用道具

地板
tangliang0905 发表于 2014-11-15 02:56:28 |只看作者 |坛友微信交流群
bobguy 发表于 2014-11-15 00:53
It can be simple as below.

%let n=10;
不好意思,我领会错你的意思了,我再次运行一次以后出来想要的结果了。
The SAS System


i y
1 1.0000
2 3.0000
3 7.0000
4 4.6000
5 5.0000
6 5.2800
7 5.0600
8 5.1140
9 5.1310
10 5.1117

十分感谢!!!
但是,我还有一个问题,就是array的时候,你已经定义了前三个数字是1,3,7,但是如果碰到需要调用的情况,应该怎么办呢?因为前三个数字也许是2,4,8,也可能是3,5,9,有其他的方法吗?再次感谢

使用道具

7
bobguy 发表于 2014-11-16 01:27:03 |只看作者 |坛友微信交流群
tangliang0905 发表于 2014-11-15 02:56
不好意思,我领会错你的意思了,我再次运行一次以后出来想要的结果了。
The SAS System
For convenient use,  you can set up a macro variable to store a initial value list.


%let n=10;

%let init_val=2,4,8;

data tmp;
array x(&n) _temporary_ (&init_val);
do i=1 to &n;
   if i<=3 then ;
   else x = 0.5*x[i-1]+0.3*x[i-2]+0.2*x[i-3];
   y=x;
   output;
end;
run;

proc print;run;

使用道具

8
tangliang0905 发表于 2014-11-18 00:39:17 |只看作者 |坛友微信交流群
thanks

使用道具

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

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

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

GMT+8, 2024-4-28 04:34