我一般不熟悉R和编程,并且正在为在生命表中构建lx函数的for循环而苦苦挣扎。
我有年龄函数x,死亡函数qx(正好x的某人在达到年龄x + 1之前会死亡的概率)和生存函数px = 1-qx。
我想编写一个函数,该函数返回一个向量,该向量包含表中从头到尾的所有lx值。功能很简单... 我定义了群组=1000000。表中的第一个年龄是x = 5,所以考虑x = 5 ... l_(x)=同类群组 而且,从现在开始,l_(x + n)= l_(x + n-1)* p_(x + n-1)
我已经搜索了for循环,并且我只能让我的代码适用于lx [1]和lx [2],如果n> 2,我将无法获得lx [n]的代码。
我写了那个函数:
living_x <- function(px, cohort){
result <- vector("double", length(px))
l_x <- vector("double", length(px))
for (i in 1:length(px)){
if (i == 1){
l_x[i] = cohort
}
else l_x[i] = l_x[i-1]*px[i-1]
result[i] = l_x
print(result)
}
}
当我运行它时,我得到几个输出(大于length(px))和“有50个或更多警告(使用warnings()查看前50个)”。 当我运行warnings()时,对于每个数字,我都会得到“结果[i] <-l_x:要替换的项目数不是替换长度的倍数”。
此外,我尝试的所有操作都会给我带来不同的错误,或者仅为lx [1]和lx [2]计算lx。我知道我的代码确实有问题,但是我仍然无法识别它。如果有人可以给我提示以找出要更改的内容,我将感到非常高兴。
谢谢!
答案 0 :(得分:2)
以下是使用tidyverse软件包中的dplyr
来使用px
来计算lx
的方法。可以使用excerpt$lx = 100000 * cumprod(1 - lag(excerpt$qx))
在“ Base R”中类似地完成此操作。
lx
包中提供了 babynames
,因此我们可以检查我们的工作:
library(tidyverse)
library(babynames)
# Get excerpt with age, qx, and lx.
excerpt <- lifetables %>%
filter(year == 2010, sex == "F") %>%
select(x, qx_given = qx, lx_given = lx)
excerpt
# A tibble: 120 x 3
x qx_given lx_given
<dbl> <dbl> <dbl>
1 0 0.00495 100000
2 1 0.00035 99505
3 2 0.00022 99471
4 3 0.00016 99449
5 4 0.00012 99433
6 5 0.00011 99421
7 6 0.00011 99410
8 7 0.0001 99399
9 8 0.0001 99389
10 9 0.00009 99379
# ... with 110 more rows
使用该数据估算lx_calc
:
est_lx <- excerpt %>%
mutate(px = 1 - qx_given,
cuml_px = cumprod(lag(px, default = 1)),
lx_calc = cuml_px * 100000)
最后,在视觉上将给定的lx
与基于px
计算的结果进行比较。它们完全匹配。
est_lx %>%
gather(version, val, c(lx_given, lx_calc)) %>%
ggplot(aes(x, val, color = version)) + geom_line()
答案 1 :(得分:0)
再考虑几分钟后,我可以通过一种非常简单的方式来做到这一点。
lx = c()
for (i in 2:length(px)){
lx[1] = 10**6
lx[i] = lx[i-1]*px[i-1]
}