Stata中的简单函数

Stata中的简单函数,stata,Stata,编辑:感谢乔的建议,我会让我的问题更具体。实际上我需要在Stata中编写一个函数,它接受变量a,B,C,D,。。。作为输入,变量Y作为输出,可使用常用的Stata函数/命令进行计算,如“生成虚拟=2*myfun(X)if…” 函数本身包含数值计算。伪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中编写一个函数,它接受变量a,B,C,D,。。。作为输入,变量Y作为输出,可使用常用的Stata函数/命令进行计算,如“生成虚拟=2*myfun(X)if…”

函数本身包含数值计算。伪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中的本机“program”命令不适合这种类型的问题,因为它不能将变量作为输入/输出

(对原始问题的回答)

我从来没用过SAS,但我猜你想要这样的东西

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

但是坚持住;这条中间线看起来也像

    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中的本机“程序”命令不适合这种类型的问题,因为它不能将变量作为输入/输出。”这种猜测是完全错误的。你也可以编写一个程序来实现这一点。这个例子是示意性的,不是决定性的。一个真正的程序将包括更多的检查和错误消息,以匹配任何不正确的输入。要获得详细的建议,您确实需要阅读文档。只有一个答案,即使是编写简单的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中,命令和功能是不同的;“函数”不是命令的同义词

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


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

我建议你多解释一下你在这里做什么。代码转换明确不在StackOverflow主题上;更确切地说,让问题足够详细,程序员可以在不了解SAS的情况下回答您的问题,并将SAS代码留在其中,以便为碰巧了解这两个方面的人添加细节。我明白您的意思。很抱歉我的第一个问题。太不清楚了。我已经说得更具体了。真正的问题是函数内部计算的长度和可能输入变量的种类。另外,我需要在很多不同的场合评估功能。谢谢你的建议。我不知道“程序”的能力。我会试试看。
   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