1

在我的 Statado脚本中,我经常需要比较可能丢失的日期。不幸的是, 的内部表示.是给定范围的最大可能数,因此以下成立:

5 < .

这可能会变得非常烦人,例如在检查日期是否在某个范围内时:

gen between_start_stop     = . if d == .
replace between_start_stop = 1 if ///
    !missing(d) & !missing(start) & !missing(stop) & ///
    start < d & d < stop
replace between_start_stop = 0 if ///
    ((!missing(d) & !missing(start) & !(start < d)) | ///
     (!missing(d) & !missing(stop) & !(d < stop))

而不是以下内容:

gen between_start_stop = (start < d) & (d < stop)

有没有办法使用与三元逻辑一起使用比较运算符

即,我希望以下陈述为真:

(5 < .) == .
(. < .) == .
(. < 5) == .
(. & 1) == .
(. & 0) == 0
etc...
4

2 回答 2

2

几个建议:

  1. 使用inrange()(也可以查看 inlist)来指定范围而不是一系列<and>语句;
  2. missing()您可以在or!missing()语句中指定多个项目,例如!missing(start, stop, d)and
  3. 听起来您确实想使用cond(),它(使用帮助文件中的 ex)可用于在一个函数中指定多个条件:

    g var = 1 if cond(missing(x), ., cond(x>2,50,70))

返回.ifx缺失,返回50if x > 2,并返回70ifx < 2

于 2011-07-12T15:36:02.000 回答
0

这个类比不会让你得到你想要的——当已知 d 低于已知开始时(即使 stop 在这里无关紧要地丢失)或已知 d 高于已知停止(即使 start在这里无关紧要地丢失了)。两种情况下的正确值都是“假”。我有一个实用程序(“有效”),它允许“生成”访问三值逻辑并执行您想要的操作 - 请参阅我的网页http://www.nuffield.ox.ac.uk/People/sites/上的讨论KIM/SitePages/Biography.aspx ,其中包含指向进一步扩展的论文的链接(但请注意 - 刚刚被 Stata Journal 拒绝为“太难以理解”

于 2014-04-22T19:37:33.423 回答