SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1642|回复: 10
打印 上一主题 下一主题

为什么LAG失效

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2012-2-22 23:49:07 | 只看该作者

为什么LAG失效

在SAS DUMMY看到的:
[code:mxpft3mp]data test;
  infile datalines dlm=',' dsd;
  input a b c;
  datalines;
4272451,17878,17878
4272451,17878,17878
4272451,17887,17887
4272454,17878,17878
4272454,17881,17881
4272454,17893,17893
4272455,17878,17878
4272455,17878,18200
run;

data testLags;
  retain e f ( 1 1);
  set test;
  if a=lag(a) and b>lag(b) then
    e=e+1;
  else if a^=lag(a) or lag(a)=. then
      e=1;
  if a^=lag(a) or lag(a)=. then
      f=1;
  else if a=lag(a) and b>lag(b) then
      f=f+1;
run;

proc print data=testLags;
run;[/code:mxpft3mp]

还是没明白,为什么F的值在第五行就没有累加???

原文解释是:Let's review how the LAG function works. It draws values from a queue of previous values, and within each DATA step iteration that you call the LAG function, it draws a previous value from the queue. The trick here is that this program does not call the LAG function for both A and B with each iteration of the DATA step! Because the IF statements combine two conditions with an AND, if the first condition resolves to false, the second condition is not evaluated. After all, in logic-speak, FALSE AND (ANY value) is always FALSE, so the DATA step can save work by not bothering to evaluate the remainder of the expression.

  if a=lag(a) /* if false*/ and b>lag(b) /* then this is not evaluated*/
And then the next time around, when the LAG(b) function is called again, it's "behind" one on the queue for the value of b
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2012-2-23 09:07:17 | 只看该作者

Re: 为什么LAG失效

由于and前边的条件为假,所以后面的条件就不会去执行,因此第五行的lag(b)实际上是17887,因此f没有加1.lag的原理类似于一个队列,然后从这个队列里面取值,而不是直观上数据集的顺序。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2012-2-23 21:42:24 | 只看该作者

Re: 为什么LAG失效

那第二行的F为什么不是2呢,它满足a=lag(a) and b>lag(b)的条件啊。第二行是LAG(b)函数第一次起作用,返回的值应该是缺失值啊,再次求教。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2012-2-24 12:43:44 | 只看该作者

Re: 为什么LAG失效

it is a trick about  short circuiting.
For improving the performance and efficiency, boolean short circuiting was used in an IF or
DO/WHEN/SELECT that has OR or AND operators in SAS, as a result, you have to be more carefull
when you are using some speical function with logical expressions.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2012-2-24 22:01:37 | 只看该作者

Re: 为什么LAG失效

_______________________
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2012-2-25 10:23:12 | 只看该作者

Re: 为什么LAG失效

额,我发现我的逻辑观受到严重挑战……
在_N_=5的过程中,进入后面2条if then else 语句,这个时候,我想问一下,a,b,lag(a),lag(b) 是不是已经进入PDV不会变化了?——这里不用管lag(a)lag(b)是什么值——那么此时,第一个if then else的结果是e+1,因为e=2的情况只可能在这一步实现,也就是意味着a=lag(a) and b>lag(b) 为真。在紧接着的if then else 语句里,由于a=lag(a) 为真,所以a^=lag(a)为假,lag(a)=.这条也为假,因为a=lag(a)而a并非. 。那么进入else阶段,前面一条if then else语句已经判断过了,那么这个过程中,我相信这些variables的值是不会变的吧,那么else if部分为真,那么f应该为f+1,即2,但是实际上是1?前后岂不是矛盾?……
好了,我描述了我困惑的地方,虽然没有去查lag的用法和可能的特殊情况,比如因为没有运行而存的是再上面的记录,但是从逻辑上过不去……当然可能存在我看题走眼、思维混乱等其他情况,请大师们指出和解答~~谢谢~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2012-2-25 10:32:32 | 只看该作者

Re: 为什么LAG失效

除非,e的lag(b)和f的lag(b)是不一样的,但是为什么不一样?如果仅仅是因为上一步语句a=lag(a)为假而导致后面部分不运行,但是在同一data loop中,而且仅仅是在if then else语句里,2个lag(b)的判断结果——亦或是2个lag(a)的——不一样?但是其他地方都一样,所以应该不是bug,却无法理解啊……
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2012-2-27 12:07:42 | 只看该作者

Re: 为什么LAG失效

查了一下资料,e的lag(b)和f的lag(b)还真的不一样!……每一个lag都是无关的,所以不能用逻辑来判断这个东西。。。只能说SAS运行机理太复杂了,还需要多多学习啊!~~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2012-2-28 14:05:01 | 只看该作者

Re: 为什么LAG失效

话说,我貌似搞懂lag怎么运行的了,但是因此提出一点:[color=#FF0040:3n21vxep]不管and之前的语句是否为真,and后面的部分也应该是执行的。只有if不为真的时候,then不执行。[/color:3n21vxep]
请教前辈,如果我上面那句话错的话,该如何解释?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2012-3-2 17:17:37 | 只看该作者

Re: 为什么LAG失效

这句话“不管and之前的语句是否为真,and后面的部分也应该是执行的”在SAS里边是不成立的。
这个帖子里面实际上是两个问题(1)lag的用法(2)short-circuiting
在SAS中,为了提高性能,SAS采用了short-circuiting,既如果if 语句是 与运算,如果第一个表达式为false,则不会判断and后面的表达式是否为真,直接跳到else执行,所以lag函数的指针的位置没有改变,还是在之前的位置,这就是为什么会出现帖子中两段好像一样的语句,结果不一样。
如果想用lag,最好先把lag的值赋给临时的变量,避免出现这个的问题。

t1=lag(a);
t2=lag(b);
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-7 06:39 , Processed in 0.118200 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表