0

編集:ジョーのアドバイスに感謝します。質問をより具体的にします。実際には、変数 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 のネイティブな "program" コマンドは、変数を入出力として使用できないため、この種の問題には適していないと思います。

4

1 に答える 1

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 に関する 1 つの回答では、単純な 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 では、コマンドと関数は区別されます。「関数」はコマンドの同義語ではありません。

2 番目の脚注: を確認してくださいrecode。必要なものかもしれませんが、整数コードを他の整数コードにマッピングするのに最適です。

3 番目の脚注: 必要なチェックの例は、 の引数generate()が有効で新しい変数名であることです。

于 2013-08-06T17:42:03.667 に答える