全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
13779 6
2009-09-27
我有如下的程序,我想把他写成一个循环语句,这样更简单

        use x1
        replace st_name = "ar" if ( n_th_row <= 480 )
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * (`i'-1970) + 1 & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save x.dta, replace
        clear        
        use x2
        replace st_name = "ne" if ( n_th_row <= 480 )
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * (`i'-1970) + 1 & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save y.dta, replace
        clear
        use x3
        replace st_name = "ky" if ( n_th_row <= 480 )
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * (`i'-1970) + 1 & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }        
        save z.dta, replace
        use x4
        replace st_name = "wv" if ( n_th_row <= 480 )
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * (`i'-1970) + 1 & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save zz.dta, replace
我的循环语句是:

        local s = 0
        foreach v in ar ne ky wv {
        local s = `s' + 1
        use x`s'
        replace st_name = "`v'" if (n_th_row <= 480)
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * ((`i'-1970) + 1) & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save x`s'.dta, replace
        }        
        }

但是运行了半天,还是出不来结果啊。。。高手们可以帮我看一下么?

还有一个问题,我有如下的stata语句
        gen mw_frst90_y_ky_1 = 3.35
        gen mw_frst90_y_ky_3 = 3.61
        gen mw_frst90_y_ky_5 = 9999

        gen mw_frst90_y_ky_year_1 = 1990
        gen mw_frst90_y_ky_year_2 = 1991
        gen mw_frst90_y_ky_year_3 = 1991
        gen mw_frst90_y_ky_year_4 = 1993
        gen mw_frst90_y_ky_year_5 = 1993
        gen mw_frst90_y_ky_year_6 = 2010

        gen mw_frst90_y_ky_month_1 = 7
        gen mw_frst90_y_ky_month_2 = 6
        gen mw_frst90_y_ky_month_3 = 7
        gen mw_frst90_y_ky_month_4 = 3
        gen mw_frst90_y_ky_month_5 = 4
        gen mw_frst90_y_ky_month_6 = 12

        forvalues k = 1(2)5 {
        local j = `k' + 1
        replace mw_frst90_y = mw_frst90_y_ky_`k' if ((year >= mw_frst90_y_ky_year_`k') & (month >= mw_frst90_y_ky_month_`k')) & ((year <= mw_frst90_y_ky_year_`j') & (month <= mw_frst90_y_ky_month_`j')) & (st_id == 27)
        }

这个语句的作用就是对mw_frst90_y这个变量产生一个step function(分段函数),比如gen mw_frst90_y_ky_1 = 3.35;gen mw_frst90_y_ky_year_1 = 1990       gen mw_frst90_y_ky_year_2 = 1991;         gen mw_frst90_y_ky_month_1 = 7       gen mw_frst90_y_ky_month_2 = 6 这个语句意思就是mw_frst90_y在1990年7月到1991年6月的值是3.35. 现在的问题是如果用replace语句的话,最中间的那个 & 会导致符合这个条件的变量个数为0,因为month不可能又大于7又小于6,但是对于比如1990年1月到1992年4月,这个语句就没问题,现在的问题是,如何让这个语句也能适应那种第一个Month的值大于第二个Month的值呢?


非常感谢大家了
二维码

扫码加我 拉你入群

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

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

全部回复
2009-9-28 12:07:59
wyy19860530 发表于 2009-9-27 22:43 我的循环语句是:
        local s = 0
        foreach v in ar ne ky wv {
        local s = `s' + 1
        use x`s'
        replace st_name = "`v'" if (n_th_row <= 480)
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * ((`i'-1970) + 1) & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save x`s'.dta, replace
        }        
        }
其中,use x`s'改成use x`s',clear

另外,最后多了一个“}”吧?
二维码

扫码加我 拉你入群

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

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

2009-9-28 12:12:52
wyy19860530 发表于 2009-9-27 22:43 这个语句的作用就是对mw_frst90_y这个变量产生一个step function(分段函数)
你能直接把这个分段函数的数学表达式写一下吗?
二维码

扫码加我 拉你入群

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

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

2009-9-28 21:57:39
在时间段1990年7月到1991年6月,mw_frst90_y = 3.35, 在时间段1991年7月到1993年3月,mw_frst90_y= 3.61, 在时间段1993-2010, mw_frst90_y=9999,就是产生这么一个step fuction,或者说分段函数
二维码

扫码加我 拉你入群

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

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

2009-9-30 18:36:41
wyy19860530 发表于 2009-9-28 21:57 在时间段1990年7月到1991年6月,mw_frst90_y = 3.35, 在时间段1991年7月到1993年3月,mw_frst90_y= 3.61, 在时间段1993-2010, mw_frst90_y=9999,就是产生这么一个step fuction,或者说分段函数
表达时间段的变量是什么?其类型是什么?
二维码

扫码加我 拉你入群

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

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

2009-10-4 12:38:08
表达时间段的变量是:mw_frst90_y_ky_year_k 和mw_frst90_y_ky_month_k,就是定义的时间变量,是一个范围,后来我问了一个老师,他说要对于这种year_k >year_j的情况要分情况讨论,具体说,就是定义month_begin
和month_end这两个变量
1. if month_begin =< month_end, 就可以用上述的replace语句来做
2. if month_begin > month_end,
比如gen mw_frst90_y_ky_1 = 3.35;gen mw_frst90_y_ky_year_1 = 1990       gen mw_frst90_y_ky_year_2 = 1991;         gen mw_frst90_y_ky_month_1 = 7       gen mw_frst90_y_ky_month_2 = 6 这个语句意思就是mw_frst90_y在1990年7月到1991年6月的值是3.35.
语句的目的就要从1990年7月到1990年12月,mw_frst90_y=3.35
然后1991年1月到1991年6月,mw_frst90_y=3.35

具体的思路就是这样,但是如果每个州的情况,我指的是情况2的中间间隔的时间各个都不一致,这个应该怎么处理呢?

非常感谢!
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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