Stata - 使用累积总和计算预期生命周期价值的值
Stata - calculating a value for expected lifetime value using a cumulative sum
我正在尝试计算个人的预期终生收入。我需要使用的公式如下:
E[寿命] = S + S/[(1+r1)] + S/[(1+r1)(1+r2)] + .... + S/[(1+r1) ..(1+rn)]
这里,r1...rn是个人活着的每一年的利率,S是个人的收入。我的问题是我有一个数据集,其中包含每个人的 S 和他们的死亡年份。现在,使用这两个数字,我需要计算所有个体的 E[lifetime]。当然,我所有年份都有 r。我如何在 Stata 中计算它?
问题是公式中r的个数取决于个人的寿命,更复杂的是,每个'r'都不一样!我有一个巨大的数据集,所以我无法机械地为每个人计算这个。请帮忙!
我尝试了 for 循环,但同样,问题是公式中的项数因人而异。
编辑:我的数据集看起来像这样:
ID Base Year Income Death Year
---------------------------------------
1 1975 1000 2008
2 1978 2423 2005
3 1980 1982 2010
4 1975 1093 2002
5 1976 4382 1999
6 1981 5492 2005
7 1978 1743 1995
我还有从 1970 年到 2010 年所有年份的 "r" 向量。现在,我需要为第一人称执行的计算是:
E[寿命] = 1000 + 1000/(1+r1976) + 1000/(1+r1976)(1+r1977) +
... + 1000/(1+r1976)(1+r1977)...(1+r2008)
假设每年的利率都在一个单独的文件中,这是一种执行此操作的方法。主要技巧是
- 将数据重塑为长格式并填写之间的年份
每个人的基准年和死亡年。
- 要获得折扣因子,请计算记录的 1/(1+rn) 项的 运行 总和,然后对其取幂以获得折扣因子的 运行 乘积。
这是 Stata 代码:
/* Create a dataset of interest rates */
clear
set obs 36
gen year= 1974 +_n
set seed 1234
gen r=uniform()/10
tempfile interest_rates
save `interest_rates'
/* Fake Income data */
clear
input id base_year income death_year
1 1975 1000 2008
2 1978 2423 2005
3 1980 1982 2010
4 1975 1093 2002
5 1976 4382 1999
6 1981 5492 2005
7 1978 1743 1995
8 2008 59 2010
end
rename base_year year0
rename death_year year1
reshape long year, i(id income) j(time)
drop time
xtset id year
tsfill
capture ssc install carryforward
bysort id: carryforward income, replace
merge m:1 year using `interest_rates', keep(match) nogen
bysort id (year): replace r=0 if _n==1 // don't discount at t=1
bysort id (year): gen dfactor = sum(ln(1/(1+r)))
bysort id (year): replace dfactor = exp(dfactor)
gen double disc_income = income * dfactor
collapse (sum) exp_income = disc_income, by(id)
比如obs 8(我加的)从2008年到2010年的收入是59,那么应该是
. di 59 + 59/(1+.0084592)+59/((1+.0084592)*(1+.0834539))
171.50379
我正在尝试计算个人的预期终生收入。我需要使用的公式如下:
E[寿命] = S + S/[(1+r1)] + S/[(1+r1)(1+r2)] + .... + S/[(1+r1) ..(1+rn)]
这里,r1...rn是个人活着的每一年的利率,S是个人的收入。我的问题是我有一个数据集,其中包含每个人的 S 和他们的死亡年份。现在,使用这两个数字,我需要计算所有个体的 E[lifetime]。当然,我所有年份都有 r。我如何在 Stata 中计算它?
问题是公式中r的个数取决于个人的寿命,更复杂的是,每个'r'都不一样!我有一个巨大的数据集,所以我无法机械地为每个人计算这个。请帮忙!
我尝试了 for 循环,但同样,问题是公式中的项数因人而异。
编辑:我的数据集看起来像这样:
ID Base Year Income Death Year
---------------------------------------
1 1975 1000 2008
2 1978 2423 2005
3 1980 1982 2010
4 1975 1093 2002
5 1976 4382 1999
6 1981 5492 2005
7 1978 1743 1995
我还有从 1970 年到 2010 年所有年份的 "r" 向量。现在,我需要为第一人称执行的计算是:
E[寿命] = 1000 + 1000/(1+r1976) + 1000/(1+r1976)(1+r1977) +
... + 1000/(1+r1976)(1+r1977)...(1+r2008)
假设每年的利率都在一个单独的文件中,这是一种执行此操作的方法。主要技巧是
- 将数据重塑为长格式并填写之间的年份 每个人的基准年和死亡年。
- 要获得折扣因子,请计算记录的 1/(1+rn) 项的 运行 总和,然后对其取幂以获得折扣因子的 运行 乘积。
这是 Stata 代码:
/* Create a dataset of interest rates */
clear
set obs 36
gen year= 1974 +_n
set seed 1234
gen r=uniform()/10
tempfile interest_rates
save `interest_rates'
/* Fake Income data */
clear
input id base_year income death_year
1 1975 1000 2008
2 1978 2423 2005
3 1980 1982 2010
4 1975 1093 2002
5 1976 4382 1999
6 1981 5492 2005
7 1978 1743 1995
8 2008 59 2010
end
rename base_year year0
rename death_year year1
reshape long year, i(id income) j(time)
drop time
xtset id year
tsfill
capture ssc install carryforward
bysort id: carryforward income, replace
merge m:1 year using `interest_rates', keep(match) nogen
bysort id (year): replace r=0 if _n==1 // don't discount at t=1
bysort id (year): gen dfactor = sum(ln(1/(1+r)))
bysort id (year): replace dfactor = exp(dfactor)
gen double disc_income = income * dfactor
collapse (sum) exp_income = disc_income, by(id)
比如obs 8(我加的)从2008年到2010年的收入是59,那么应该是
. di 59 + 59/(1+.0084592)+59/((1+.0084592)*(1+.0834539))
171.50379