Memo2: Stata循环入门教程

memo :循环

0.生成数据
** 生成数据 **
clear all
set obs 28
set seed 123
egen id = repeat(), v(1/4)
egen cou = ntos(id), from(1/4) to(CHN USA FRA RUS)
sort id
egen year = repeat(), v(2011/2017)
gen sd = rnormal()
sort sd
gen value = _n * 2
sort id year
gen r1 = year* 0.1 + runiform() * 100
gen r2 = runiform() * 100 + id * 500 + rnormal()
gen r3 = (year - 1000)  + runiform() * id* 500
gen r4 = 1
drop sd
label var r1 "GDP"
label var r2 "gdp"
label var r3 "FDI"
cap snapshot erase 1 
snapshot save, label("data")

在这里插入图片描述

1.forvalues——针对数值的循环
A "数值"可以指代样本
(1)直接写 vs 循环
**# *** forvalues : 对“数值”进行循环 ***

** 直接写 **
snapshot restore 1		//restore the data
replace r4 = r4 + 2012 if year == 2012
replace r4 = r4 + 2013 if year == 2013
replace r4 = r4 + 2014 if year == 2014
replace r4 = r4 + 2015 if year == 2015
replace r4 = r4 + 2016 if year == 2016

** 写成循环 **
snapshot restore 1
forvalues i = 2012/2016{
	replace r4 = r4 + `i' if year == `i'
}

在这里插入图片描述

(2)步长
snapshot restore 1

** 步长 **
/*
forvalues i = 2012(1)2016{						// 2012  2013  2014  2015  2016
	replace r4 = r4 + `i' if year == `i'
}
*/

forvalues i = 2012(2)2016{     					// 2012   2014   2016
	replace r4 = r4 + `i' if year == `i'
}

在这里插入图片描述

(3)新的暂元
snapshot restore 1
** 新的暂元 **
forvalues i = 2012/2016{
	local j = `i' / 2
	replace r4 = r4 + `j' if year == `i'
}

在这里插入图片描述

B“数值”可以指代变量
** 直接写 **
/*
snapshot restore 1
gen lnr1 = ln(0.01 + r1)
drop r1
gen lnr2 = ln(0.01 + r2)
drop r2
gen lnr3 = ln(0.01 + r3)
drop r3
gen lnr4 = ln(0.01 + r4)
drop r4
*/

** 写成循环 **
snapshot restore 1
forvalues i = 1/4{
	gen lnr`i' = ln(0.01+r`i')
	drop r`i'
}

在这里插入图片描述

2.foreach——针对对象的循环
A "对象"可以指代变量
(1)现存变量
snapshot restore 1

** 现存变量 **
foreach i of var r1 r2 r3 r4 {
	gen ln`i' = ln(0.01+`i')
	drop `i'
}

在这里插入图片描述

(2)新变量
snapshot restore 1
** 新变量 **
foreach i of newlist z1-z20 {
	gen `i' = runiform()
}

在这里插入图片描述

(3)简化
** 可简化成 (使用 "暂元 in 对象" 的句式 无需强调对象的属性)
foreach i in r1 r2 r3 r4 {
	gen ln`i' = ln(0.01+`i')
	drop `i'
}
B "对象"可以指代数值
snapshot restore 1

foreach i of numlist 2012 2013/2015 2016 {
	local j = `i' / 2
	replace r4 = r4 + `j' if year == `i'
}

在这里插入图片描述

B "对象"可以指代字符串
snapshot restore 1
discard
foreach i in CHN USA {
	line r1 year if cou == "`i'" , subtitle("`i'") name(`i')
}
graph combine CHN USA, xsize(35) ysize(15)

在这里插入图片描述

3.while——基于判定的循环

只要年份小于2016年,就把value替换成0

clear 
set obs 10
gen year = _n + 2010
gen value = runiform()* 200

local i = 2011 
while `i' < 2016 {
	replace value = 0 if year == `i'
	local i = `i' + 1
}

在这里插入图片描述

my info

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengke25

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值