Stata中的简单功能

时间:2013-08-06 16:24:03

标签: stata

编辑:感谢Joe的建议,我会更具体地提出我的问题。实际上我需要在Stata中编写一个函数,它将变量A,B,C,D,...作为输入,变量Y作为输出,可以使用常用的Stata函数/命令来评估,例如“generate dummy = 2 * myfun”( X)如果......“

函数本身包含数值计算。伪Stata代码看起来像

myfun(X)
 gen Y=0.5*X if X==1
 replace Y=31-X if X==2
 replace Y=X-2 if X==3
 .... a long list
return(Y) 

请注意,X可以是一组庞大的不同Stata变量,并且函数内部的数值计算相当长。这就是我想使用一个函数的原因。我想Stata中的原生“程序”命令不适合这类问题,因为它不能将变量作为输入/输出。

1 个答案:

答案 0 :(得分:1)

(原始问题的答案)

我从来没有使用过SAS,但是在猜测中你需要像

这样的东西
foreach v in A B C D { 
    gen test`v' = 0.5 * (`v' == 1) + 0.6 * (`v' == 2) + 0.7 * (`v' == 3)  
}

foreach v in A B C D { 
    gen test`v' = cond(`v' == 1, 0.5, cond(`v' == 2, 0.6, cond(`v' == 3, 0.7, .))) 
}

但坚持下去;中间线也看起来像

    gen test`v' = (4 + `v') / 10 

(回答完全不同的问题)

这可以通过各种方式完成。如上所述,你可以有一个循环

  foreach v in A B C D { 
      gen test`v' = 0.5 * `v' if `v' == 1 
      replace test`v' = 31 - `v' if `v' == 2 
      replace test`v' = `v' - 2 if `v' == 3 
  }   

问题是“我猜Stata中的原生”程序“命令不适合这类问题,因为它不能将变量作为输入/输出。”这个猜测是完全错误的。你也可以写一个程序来做这件事。这个例子是示意图,不是确定的。真正的程序将包括更多检查和错误消息,以匹配任何不正确的输入。有关详细建议,您真的需要阅读文档。关于SO的一个答案不能教你所有你需要知道甚至编写简单的Stata程序。无论如何,这个例子显然是无聊的和/或不完整的,所以一个完整的工作例子将毫无意义或不可能。

   program myweirdexample 
       version 13 
       syntax varlist(numeric), Generate(namelist) 

       local nold : word count `varlist'
       local nnew : word count `generate' 
       if `nold' != `nnew' { 
            di as err "`generate' does not match `varlist'" 
            exit 198 
       }

       local i = 1 
       quietly foreach v of local varlist { 
            local new : word `i' of `generate' 
            gen `new' = 0.5 * `v' if `v' == 1 
            replace `new' = 31 - `v' if `v' == 2 
            replace `new' = `v' - 2 if `v' == 3             
            local ++i 
       }
   end 

关于术语的脚注:该问题比Stata中使用的术语功能更广泛。在Stata中,命令和功能是截然不同的; “function”不是命令的同义词。

第二个脚注:查看recode。它可能是您所需要的,但最好将整数代码映射到其他整数代码。

第三个脚注:需要检查的一个例子是generate()的参数应该是合法的和新的变量名。