楼主: benny10
3878 14

[原创博文] 语法新手想请教各位前辈一个有关lag的问题!! [推广有奖]

  • 0关注
  • 0粉丝

硕士生

4%

还不是VIP/贵宾

-

威望
0
论坛币
114 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
2230 点
帖子
99
精华
0
在线时间
67 小时
注册时间
2007-6-23
最后登录
2020-3-25

楼主
benny10 发表于 2010-4-16 20:42:53 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
不好意思,首先先跟大家说声抱歉,我不知道字符不够可以用截图的方式,请见谅!
再来我重新说明变量的关系
原始数据有      a x y z p q1

生成的数据有    q q2

我最主要要想求得q变量的值
q2=lag(q1)
q=q1-q2

1为使用上述自行设定之语法所得出的结果

2为我真正相显示出的结果
而我的目的即要将表1中第6q2的值延续至789行,使结果可以呈现为表2的结果。
不知这样各位前辈能了解我的意思,也请各位前辈能帮我想想解决之道。

自行设定之语法为:
(if a=1
then do;
p=p1/100 ;
q=q1-q2; end;

else do;
p=0 and q=0; end;


if a=1 and q1<q2 then
eq=q1;


else if a=0 then q=0; else
q=q1-q2;

if a=0 then goto ok;
ok:q1=q2+0;q2=lag(q1);

if a=1 then q2=q1-q2;
if q<0 then q=q1;).

原始文件就是我图上的原始表格(图中的左上角),图好像太大而被截掉,但我试过先将图抓下来就可以清楚看见整张图的全貌了,先谢谢前辈您的指教了!
q1原始数据给的,所以第四列的q1数据上的57是因为p=0所造成数据读取错误的结果,我的目的就是想让它在p=0q可以等于维持q1上一期之值,也就是第3q128654之值,而不要让它读到57之值,而这也是我这个问题中最难解决的地方,希望各位前辈能帮帮我,谢谢!




二维码

扫码加我 拉你入群

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

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

关键词:请教各位前辈 lag 原始数据 else Then 我不知道

回帖推荐

yatming 发表于7楼  查看完整内容

楼主,字符不够可以截图。 另,我大概理解了楼主的意思,不过楼主应该再表述地清楚些。 变量a应该是已知的,至于q1,q2,从楼主的程序上看,貌似似乎都有赋值与计算语句,因此我猜测,q1,q2都有初始值,你的意思可能是根据条件对此进行重新赋值。 所以我猜测你的问题是: 当a=0时,你使用了如下语句:q1=q2+0;q2=lag(q1); 为什么在第二个a=0的记录时,q2,q1并没有赋值为28654,而仍然是初始的57。 首先不论函数lag,语 ...

本帖被以下文库推荐

沙发
sushe1527 发表于 2010-4-17 01:38:09
q的第七个数,怎么从28714直接到了117呢?

藤椅
benny10 发表于 2010-4-17 10:08:44
不好意思,是我没说清楚,我再将主要变量间的关系解释一下,q=q1-q2, q1q的累积量,q2q1lag一期,也就是q2=lag(q1) ,麻烦各位前辈了!

板凳
benny10 发表于 2010-4-18 20:25:17
难道真的没人有办法了吗,拜托各位前辈了!

报纸
viterbi 发表于 2010-4-20 10:20:48
靠,数据还要流量费,。。看不明楼主想干什么

地板
soporaeternus 发表于 2010-4-20 11:49:53
1 原始数据有哪些变量?需要派生的原始逻辑是什么。楼主现在的逻辑好像有点混乱。
2 按现在楼主的逻辑,有q 和 初始的 q1 或者 q2 就可以生成整个q q1 q2 序列
Let them be hard, but never unjust

7
yatming 发表于 2010-4-20 12:56:31
楼主,字符不够可以截图。
另,我大概理解了楼主的意思,不过楼主应该再表述地清楚些。
变量a应该是已知的,至于q1,q2,从楼主的程序上看,貌似似乎都有赋值与计算语句,因此我猜测,q1,q2都有初始值,你的意思可能是根据条件对此进行重新赋值。

所以我猜测你的问题是:
当a=0时,你使用了如下语句:q1=q2+0;q2=lag(q1);
为什么在第二个a=0的记录时,q2,q1并没有赋值为28654,而仍然是初始的57。

首先不论函数lag,语句本身有顺序问题,首先赋值的应该是q2,然后是q1。不然即使q2的赋值实现你要的效果,但是赋予q1的值仍然是未更新的q2值。

其次是lag函数,有以下这几点:
第一,lag函数的作用表面上看是用来取上一个值,但其内部是两个动作,一个是在临时队列中取头部元素然后删除,下一个元素变为头部元素(remove and return),另一个是往临时队列中添加元素,替代成为底部元素。而临时队列的存在,显而易见是为了下一次的取值而用来存放历史数据。其是在第一次调用时初始化。

第二,lag函数只有在它被调用的时候才会去执行,也就是说,如果lag函数是需要满足特定条件的时候才调用的话,只有在条件满足时,才会调用lag函数,所以语句中,只有在a=0的时候,lag才会调用执行,然后触发两个动作。如之前提到的,lag的进队列与出队列的动作是一起执行,因此,也只有当a=0时,lag才会往队列中添加元素。

第三,如果想对要重新赋值的变量进行lag,并想取出重新赋值的数据,则重新赋值的语句应该在lag语句之前。至于原因就是lag函数的运行机制。

此例中,个人认为是无法使用lag函数的,主要原因如下:
q2=lag(q1),当执行这条语句时,给q2赋予了队列中top的数据,然后移除top。同时把当前observation中q1的值(从楼主给出数据值猜测是57)添加到了队列的bottom,但实际上我们希望的是添加到队列的buttom是更新后q1的值(值为:28654),而更新q1的赋值语句是在q2=lag(q1)之后,因此q1更新后的值是无法在lag函数执行的时候添加到队列的buttom。

所以此列的实现个人认为还是使用retain。
  1. data result;
  2.         set temp;
  3.         retain t;
  4.         if a=0 then do;
  5.                 q2=t;
  6.                 q1=q2;
  7.         end;
  8.         else t=q1;
  9. run;
复制代码
个人意见,楼主集思广益吧。
已有 2 人评分经验 论坛币 学术水平 收起 理由
bakoll + 3 + 3 精彩帖子
soporaeternus + 1 说的很详细

总评分: 经验 + 3  论坛币 + 3  学术水平 + 1   查看全部评分

8
sushe1527 发表于 2010-4-20 18:31:36
你直接把原始表格和所想求的表格写出来就好了
你的问题是怎么从表格1怎么弄到表格2,而表格1是你自己弄的
而你也说了自己弄不清楚,所以说你的思路可能不对
这个表格1就不能作为我们计算的出发点  你说是不是?

9
benny10 发表于 2010-4-21 01:55:27
我已重新将问题再叙述过一次,请各位前辈再帮我看看,想想解决的办法,谢谢

10
yatming 发表于 2010-4-21 09:39:22
楼主还是把原始表贴出来吧。我猜测仍然是q1的原值是57。你是需要对q1进行重新赋值,否则表1与表2的q1为何不同。
  1. data result;
  2.         set temp;
  3.         retain t;
  4.         if a=0 then do;
  5.                 q2=t;
  6.                 q1=q2;
  7.                 q=q1-q2;
  8.         end;
  9.         else t=q1;
  10. run;
复制代码

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 09:50