我现在在做一个生成关于美国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里头运行不出来啊
望各位大侠指教,非常非常感谢了~~~~~~