全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
5109 4
2009-08-28
我现在在做一个生成关于美国50个州的minimum wage(有若干种minimum wage,即有很多变量,他们的分布的规律基本一致,即在某一个时间段,例如1970年3月到1973年2月,是一个常数值,在另一个时间段上,是另一个常数值,like step function)的stata程序,我已经有一个原始stata程序,非常大,有很多类似的或者重复的语句,希望把它简化并且整理,我的想法是先打算做出2,3个州的子程序,然后再把后面的州的按一个州对应一个子程序的方法加进去,最后做主程序,一一执行这些子程序,不知道这样的思路是否可行,例如我的AK州的子程序如下:
replace dsources = 1 if st_name == "ak"
ds_gnrl = 1 for ak if from ``www.dol.gov/esa/whd/state/stateMinWageHis.htm
saved as ``stateMinWageHis.htm"
ds_gnrl = 2 for ak if from Monthly Labor Review Online
ds_gnrl = 3 for ak if from www.labor.state.ak.us/lss/whact.htm
saved as Alaska.htm

replace ds_gnrl = 1 ///
          if ( st_name == "ak" & ( year == 1970 | year == 1972 | year == 1976 | year == 1979 ) )
replace ds_gnrl = 2 ///
          if ( st_name == "ak" & ( year >= 1980 & year <= 2002 ) )
replace ds_gnrl = 3 ///
          if ( st_name == "ak" & ( year >= 2003 & year <= 2009 ) )

replace mw_gnrl = 2.1 ///
          if ( st_name == "ak" & ( year == 1970 | year == 1972 ) )
replace mw_gnrl = 2.8 ///
          if ( st_name == "ak" & year == 1976 )
replace mw_gnrl = 3.4 ///
          if ( st_name == "ak" & year == 1979 )
replace mw_gnrl = 3.6 ///
          if ( st_name == "ak" & year == 1980 )
replace mw_gnrl = 3.85 ///
          if ( st_name == "ak" & ( year >= 1981 & year <= 1989 ) ) & ///
          if ( st_name == "ak" & ( year == 1990 & month <= 3 ) )
replace mw_gnrl = 4.3 ///
          if ( st_name == "ak" & ( year == 1990 & month >= 4 ) ) & ///
          if ( st_name == "ak" & ( year == 1991 & month <= 3 ) )
replace mw_gnrl = 4.75 ///
          if ( st_name == "ak" & ( year == 1991 & month >= 4 ) ) & ///
          if ( st_name == "ak" & ( year >= 1992 & year <= 1995 ) ) & ///
          if ( st_name == "ak" & ( year == 1996 & month <= 9 ) )
replace mw_gnrl = 5.25 ///
          if ( st_name == "ak" & ( year == 1996 & month >= 10 ) ) & ///
          if ( st_name == "ak" & ( year == 1997 & month <= 8 ) )
replace mw_gnrl = 5.65 ///
          if ( st_name == "ak" & ( year == 1997 & month >= 9 ) ) & ///
          if ( st_name == "ak" & ( year >= 1998 & year <= 2002 ) )
replace mw_gnrl = 7.15 ///
          if ( st_name == "ak" & ( year >= 2003 & year <= 2009 ) )

replace yeff = 1980 ///
          if ( st_name == "ak" & year == 1980 )
replace yeff = 1981 ///
          if ( st_name == "ak" & ( year >= 1981 & year <= 1989 ) ) & ///
          if ( st_name == "ak" & ( year == 1990 & month <= 3 ) )
replace yeff = 1990 ///
          if ( st_name == "ak" & ( year == 1990 & month >= 4 ) ) & ///
          if ( st_name == "ak" & ( year == 1991 & month <= 3 ) )
replace yeff = 1991 ///
          if ( st_name == "ak" & ( year == 1991 & month >= 4 ) ) & //
          if ( st_name == "ak" & ( year >= 1992 & year <= 1995 ) ) & ///
          if ( st_name == "ak" & ( year == 1996 & month <= 9 ) )
replace yeff = 1996 ///
          if ( st_name == "ak" & ( year == 1996 & month >= 10 ) ) & ///
          if ( st_name == "ak" & ( year == 1997 & month <= 8 ) )
replace yeff = 1997 ///
          if ( st_name == "ak" & ( year == 1997 & month >= 9 ) ) & ///
          if ( st_name == "ak" & ( year >= 1998 & year <= 2002 ) )
replace yeff = 2003 ///
          if ( st_name == "ak" & ( year >= 2003 & year <= 2009 ) )

replace meff = 1 ///
          if ( st_name == "ak" & year == 1980 ) & ///
          if ( st_name == "ak" & ( year >= 1981 & year <= 1989 ) ) & ///
          if ( st_name == "ak" & ( year == 1990 & month <= 3 ) ) & ///
          if ( st_name == "ak" & ( year >= 2003 & year <= 2009 ) )
replace meff = 4 ///
          if ( st_name == "ak" & ( year == 1990 & month >= 4 ) ) & ///
          if ( st_name == "ak" & ( year == 1991 & month <= 3 ) ) & ///
          if ( st_name == "ak" & ( year == 1991 & month >= 4 ) ) & ///
          if ( st_name == "ak" & ( year >= 1992 & year <= 1995 ) ) & ///
          if ( st_name == "ak" & ( year == 1996 & month <= 9 ) )
replace meff = 10 ///
          if ( st_name == "ak" & ( year == 1996 & month >= 10 ) ) & ///
          if ( st_name == "ak" & ( year == 1997 & month <= 8 ) )
replace meff = 9 ///
          if ( st_name == "ak" & ( year == 1997 & month >= 9 ) ) & ///
          if ( st_name == "ak" & ( year >= 1998 & year <= 2002 ) )
        
replace deff = 1 ///
          if ( st_name == "ak" & year == 1980 ) & ///
          if ( st_name == "ak" & ( year >= 1981 & year <= 1989 ) ) & ///
          if ( st_name == "ak" & ( year == 1990 & month <= 3 ) ) & ///
          if ( st_name == "ak" & ( year == 1990 & month >= 4 ) ) & ///
          if ( st_name == "ak" & ( year == 1991 & month <= 3 ) ) & ///
          if ( st_name == "ak" & ( year == 1991 & month >= 4 ) ) & ///
          if ( st_name == "ak" & ( year >= 1992 & year <= 1995 ) ) & ///
          if ( st_name == "ak" & ( year == 1996 & month <= 9 ) ) & ///
          if ( st_name == "ak" & ( year == 1996 & month >= 10 ) ) & ///
          if ( st_name == "ak" & ( year == 1997 & month <= 8 ) ) & ///
          if ( st_name == "ak" & ( year == 1997 & month >= 9 ) ) & ///
          if ( st_name == "ak" & ( year >= 1998 & year <= 2002 ) ) & ///
          if ( st_name == "ak" & ( year >= 2003 & year <= 2009 ) )
save dt_mw_2009_04_20_m, replace

再例如AL州的子程序 (Alabama does not have its own state minimum wage in its history)
local varlist1 "ds_agrclt_a ds_agrclt_y ds_frst60_a ds_frst60_y ds_frst90_a = 1 ds_frst90_y = 1
ds_gnrl = 1 ds_oppr_nonagrclt = 1 ds_oppr_tip = 1 ds_prob_agrclt_a = 1 ds_prob_agrclt_y = 1
ds_prob_nonagrclt_a = 1 ds_prob_nonagrclt_y = 1 ds_prob_tip_a = 1 ds_prob_tip_y = 1 ds_small_a = 1
ds_small_y = 1 ds_student = 1 ds_tip_a = 1 ds_tip_y = 1 ds_women = 1 ds_without_ins = 1 ds_youth = 1"

foreach var1 of varlist1 ds_agrclt_a ds_agrclt_y ds_frst60_a ds_frst60_y ds_frst90_a = 1 ds_frst90_y = 1
ds_gnrl = 1 ds_oppr_nonagrclt = 1 ds_oppr_tip = 1 ds_prob_agrclt_a = 1 ds_prob_agrclt_y = 1
ds_prob_nonagrclt_a = 1 ds_prob_nonagrclt_y = 1 ds_prob_tip_a = 1 ds_prob_tip_y = 1 ds_small_a = 1
ds_small_y = 1 ds_student = 1 ds_tip_a = 1 ds_tip_y = 1 ds_women = 1 ds_without_ins = 1 ds_youth = 1
{
replace `var1' = 1 if st_name == "al"
}

local varlist2 "yeff meff deff ypssd mpssd dpssd dexm nmw mw_gnrl mw_youth mw_tip_a mw_tip_y mw_small_a
mw_small_y mw_agrclt_a mw_agrclt_y mw_student mw_frst90_a mw_frst90_y mw_frst60_a mw_frst60_y mw_with_ins  
mw_without_ins mw_women mw_prob_nonagrclt_a mw_prob_nonagrclt_y mw_prob_agrclt_a mw_prob_agrclt_y
mw_prob_tip_a mw_prob_tip_y mw_oppr_nonagrclt mw_oppr_tip"

foreach var2 of varlist2 yeff meff deff ypssd mpssd dpssd dexm nmw mw_gnrl mw_youth mw_tip_a mw_tip_y mw_small_a
mw_small_y mw_agrclt_a mw_agrclt_y mw_student mw_frst90_a mw_frst90_y mw_frst60_a mw_frst60_y mw_with_ins  
mw_without_ins mw_women mw_prob_nonagrclt_a mw_prob_nonagrclt_y mw_prob_agrclt_a mw_prob_agrclt_y
mw_prob_tip_a mw_prob_tip_y mw_oppr_nonagrclt mw_oppr_tip
{
replace `var2' = 9999 if st_name == "al"
}
save dt_mw_2009_04_20_m, replace

其他的州与之类似,我打算将每个州的子程序名为Prog_AK(州名的英文缩写).do 这样就可以得到若干个do子程序

我现在的问题是:

1 这样写子程序可以不?特别是我AL州的foreach语句这样写法可以么? 还有什么需要注意的么?是不是要保存为ado文件呢?还是直接作为do文件放在C:\data下面?
2. 这个主程序应该怎么写啊?我尝试了下
local varlist1 "AK AL ....(美国50个州的名字)"
foreach var1 of varlist1 AK AL... (美国50个州的名字)
{
infile prog_`var1'.do
do prog_`var'.do
}
这样可以么?我在stata里头运行不出来啊

望各位大侠指教,非常非常感谢了~~~~~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-8-28 17:56:49
只需编写一个子程序即可,使用输入项
help syntax
or
help args

另外,最好把程序定义为 .ado 文件,方便调用。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-8-28 22:29:12
2# arlionn

Thank you very much for your reply. Could you say something more in detail? Why do you say only one subprogram will be OK? Since there are various situations of different variables of each state although the total variables of each state are the same, I do not think I can summarize all the situations in just one subprogram? I am a rookie in stata.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-8-30 12:29:39
请教各位大侠阿,其实问题就是:比如我有Prog_AL.ado, Prog_AK.ado,......等等,为50个子程序,我的主程序就是想用比如foreach语句来一一执行这若干个子程序,最终得到一个大矩阵,这个在STATA里面怎么实现呢?

另外我还有个问题:就是比如一个stata语句很长,有很多if条件句,是不是用/// 在句末, 然后就可以换一行继续写了呢?我试了下,感觉不行啊?

非常感谢了~~~~~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-9-1 09:37:15
换行用注释符就行
code /*
*/code
会被视为一行的
或者用 #delimit命令切换换行符
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群