使用for循环在R中建立生命表

时间:2019-05-02 19:07:00

标签: r for-loop

我一般不熟悉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。我知道我的代码确实有问题,但是我仍然无法识别它。如果有人可以给我提示以找出要更改的内容,我将感到非常高兴。

谢谢!

2 个答案:

答案 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()

enter image description here

答案 1 :(得分:0)

再考虑几分钟后,我可以通过一种非常简单的方式来做到这一点。

lx = c()
for (i in 2:length(px)){
lx[1] = 10**6
lx[i] = lx[i-1]*px[i-1]
}