我目前在一些型号上有偏差,如下数据所示:
year model_2015 model_2016 model_2017
2016 15 . .
2017 20 10 .
2018 30 20 30
在Model_2015
中执行的变量2015
具有2016
,2017
,2018
的偏差; Model_2016
和2017
的变量2018
,依此类推。
我想创建一个变量,将每个变量的第一次观察值相加。
因此对于此示例:
first = 15 + 10 + 30 = 55
我假设我必须做一个循环,但是我对如何处理感到困惑。
编辑:
理想情况下,我也想添加第二,第三等非缺失观测值的解决方案。
答案 0 :(得分:2)
以下对我有用:
generate first = model_2015[1] + model_2016[2] + model_2017[3]
但是,这是一种更通用的方法:
clear
input year model_2015 model_2016 model_2017
2016 15 . .
2017 20 10 .
2018 30 20 30
end
generate id = 1
tempfile myfile
save `myfile'
collapse (firstnm) model*, by(id)
egen first = rowtotal(model*)
keep id first
merge 1:m id using `myfile'
drop id _merge
order year model* first
list, abbreviate(15)
+-----------------------------------------------------+
| year model_2015 model_2016 model_2017 first |
|-----------------------------------------------------|
1. | 2016 15 . . 55 |
2. | 2017 20 10 . 55 |
3. | 2018 30 20 30 55 |
+-----------------------------------------------------+
编辑:
下面是一个更通用的解决方案:
clear
input year model_2015 model_2016 model_2017
2016 15 . .
2017 20 10 .
2018 30 20 30
2019 40 10 10
end
local i = 0
foreach v of varlist model* {
local ++i
local vals
forvalues j = 1 / `=_N' {
if !missing(`v'[`j']) local vals `vals' `=`v'[`j']'
}
local ind_`i' `: word 1 of `vals'' // CHANGE THIS NUMBER
local ind_all `ind_all' `ind_`i''
}
generate first = `= subinstr("`ind_all'", " ", "+", `= wordcount("`ind_all'") - 1')'
结果:
list, abbreviate(15)
+-----------------------------------------------------+
| year model_2015 model_2016 model_2017 first |
|-----------------------------------------------------|
1. | 2016 15 . . 55 |
2. | 2017 20 10 . 55 |
3. | 2018 30 20 30 55 |
4. | 2019 40 10 10 55 |
+-----------------------------------------------------+
+-----------------------------------------------------+
| year model_2015 model_2016 model_2017 second |
|-----------------------------------------------------|
1. | 2016 15 . . 50 |
2. | 2017 20 10 . 50 |
3. | 2018 30 20 30 50 |
4. | 2019 40 10 10 50 |
+-----------------------------------------------------+
+-----------------------------------------------------+
| year model_2015 model_2016 model_2017 third |
|-----------------------------------------------------|
1. | 2016 15 . . 40 |
2. | 2017 20 10 . 40 |
3. | 2018 30 20 30 40 |
4. | 2019 40 10 10 40 |
+-----------------------------------------------------+
请注意,在这种情况下,我使用了一个稍作修改的示例以更好地说明。
答案 1 :(得分:2)
下面的代码可能是您要寻找的循环:
forvalues i = 1 / `=_N' {
generate S_`i' = 0
forvalues j = `i' / `=_N' {
capture replace S_`i' = S_`i' + model_`=2015+`j'-`i''[`j']
}
}