2013-08-06 83 views
0

編輯:感謝喬的建議,我會讓我的問題更具體。實際上,我需要在Stata中編寫一個函數,它將變量A,B,C,D ......作爲輸入,並將一個變量Y作爲輸出,可以用通常的Stata函數/命令(如「generate dummy = 2 * myfun X)if ...「簡單功能在Stata

函數本身包含數值計算。僞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

我建議你多解釋一下你在這裏做什麼。代碼轉換顯式不在StackOverflow的主題上;相反,請提出足夠詳細的問題,以便[tag:stata]程序員可以在不知道SAS的情況下回答您的問題,並將SAS代碼放在其中,僅僅爲了知道兩者都知道的人添加詳細信息。 – Joe

回答

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中,命令和功能是不同的; 「功能」不是命令的同義詞。

第二個腳註:查看recode。這可能是你需要的,但最好將整數代碼映射到其他整數代碼。

第三個腳註:所需檢查的一個示例是generate()的參數應該是合法和新的變量名稱。

+0

我明白你的意思了。對於我的問題的第一個版本抱歉。這太不清楚了。我已經說得更具體。真正的問題是函數內的計算長度和可能的輸入變量的多樣性。另外,我需要在很多不同場合評估功能。 – user2657561

+0

謝謝你的建議。我不知道「程序」的能力。我會試試看。 – user2657561