检查varlist是否包含因子变量?

时间:2014-06-25 23:10:59

标签: stata

我正在尝试检查程序中的 varlist 是否包含因子变量。我遵循StataCorp在此页面中的建议(http://www.stata.com/support/faqs/programming/factor-variable-support/)。建议的代码是:

syntax varlist(fv)
local fvops = "`s(fvops)'" == "true" | _caller() >= 11
if `fvops' {
    // within this loop, you can expand the factor variable list,
    // create a local for version control and perform any other
    // steps needed for factor operated varlists
}

尽管如此,现在我觉得宏s(fvops)并没有真正检查 varlist 中是否存在因子变量。一个简单的例子来说明:

capture program drop test_fvops
program test_fvops
syntax varlist(fv)
local fvops = "`s(fvops)'" == "true" | _caller() >= 11
qui reg `varlist'
if `fvops'  {
    di "factor variables specified"
}
else {
    di "factor variables not specified"
}
end

sysuse auto,clear
test_fvops price mpg foreign weight i.rep78
test_fvops price mpg foreign weight rep78

奇怪的是,代码的最后两行都返回“指定的因子变量”。该程序无法判断第二行没有因子变量。

对宏s(fvops)属性的进一步探讨只会让我更加困惑。

sysuse auto,clear
qui reg price mpg foreign weight i.rep78
local fvops = "`s(fvops)'" != "true" | _caller() >= 11
di "|s(fvops)=`s(fvops)'|fvops=`fvops'|"

qui reg price mpg foreign weight rep78
local fvops = "`s(fvops)'" != "true" | _caller() >= 11
di "|s(fvops)=`s(fvops)'|fvops=`fvops'|"

在这两种情况下,s(fvops)为空,fvops为1.我还尝试return listsreturn list,但没有看到s(fvops)

我是否正确使用fvops代码?我在Win 7上用Stata 13运行它。

添加了: 尼克的评论澄清了我在手册中找不到的东西。所以基本上不应该包含_caller()段,并且链接页面的引用是我需要了解的s(fvops)

  

“要检查是否在varlist中指定了因子变量,您可以使用语法中保存的宏s(fvops),当指定因子变量时,它将等于”true“,否则为空。”

1 个答案:

答案 0 :(得分:3)

使用您自己的程序:您正在使用Stata 13,并且您的程序未将version设置为其他任何内容。

因此_caller()在两种情况下都大于11,并且您的测试没有测试。

为什么不尝试显示s(fvops)的值?

使用后面的代码,您的“进一步探测”:为什么期望s(fvops)可见?您从未创建它,因为您没有使用syntax。但由于同样的原因,本地宏fvops为1:_caller()大于11且|运算符选择1.