【问题标题】:Not sure how to fix the 'numerical expression has 41 elements: only the first used' warning不确定如何修复“数值表达式有 41 个元素:仅第一次使用”警告
【发布时间】:2021-04-25 20:54:06
【问题描述】:

目前正在尝试编写函数来计算保障收益和储备金/保单价值,尽管在尝试绘制时,总是会遇到相同的错误,并且对我如何解决它非常迷茫。任何帮助将不胜感激。

#Annuity-due function
AnU = function(x, n, i)
{
  An = 0
  for (k in 0:(n-1))
  {
    An = An + (1/(1+i))^k*lx[x+k]/lx[x]
  }
  return(An)
}

#Term/whole life assurance function
TWa <- function(x, n, i){
  if (missing(n)) 
    n = 120 - x - 1
  Ta = 0
  for(k in 0:(n-1))
  {
      Ta = Ta + (1/(1+i))^(k+1)*(lx[x+k]-lx[x+k+1])/lx[x]
  }
    return(Ta)
}
#Setting Premium
P <- 100000*TWa(x = 25, n = 40, i = 0.04)/AnU(x = 25, n = 40, i = 0.04)

#Policy value function
age <- c(1:120)
term <- c(1:120)
time <- c(1:120)
policy_TW <- function(time, age, term, rate)
  return(100000*TWa(x = age + time, n = term - time, i = rate) -
    P * AnU(x = age + time, n = term - time, i = rate))
for (time in 0:40)
  cat("At time", time, " policy value is ", policy_TW(time, 25, 40, 0.04), "\n")

#Plot
plot(0:40, policy_TW(0:40, 25, 40, 0.04), ylim = c(0,6000), type = "b")

> plot(0:40, policy_TW(0:40, 25, 40, 0.04), ylim = c(0,6000), type = "b")
Warning messages:
1: In 0:(n - 1) :
  numerical expression has 41 elements: only the first used
2: In 0:(n - 1) :
  numerical expression has 41 elements: only the first used

编辑:为了重现性,我忘记添加lx 代码。 这是根据链接的 xls 文件计算得出的,该文件随后被命名为 data https://www.actuaries.org.uk/documents/am92-permanent-assurances-males

# Calculate the values for lx
qx = c(rep(NA,16),data$qx)
lx = vector()
lx[1:17] = c(rep(NA,16),10000)
for (i in 18:120)
{
  lx[i]=lx[i-1]*(1-qx[i-1])
}

【问题讨论】:

  • 感谢您进行编辑。但它仍然不完全符合可重现示例的标准,因为这里没有包含代码供某人在他们的环境中轻松获取名为data 的对象而无需转到外部链接。如果将来我是你,我会在你的代码中明确地包含一些值,以代替现在所说的data$qx。然后人们可以运行此代码而无需下载任何数据。目标是让人们能够重现您的错误并为您提供帮助,而他们只需花费最少的精力就可以在本地计算机上进行设置。
  • 啊,这很公平。对于以后的问题,我一定会牢记这一点。我的朋友,非常感谢您的帮助。

标签: r function dplyr


【解决方案1】:

语法0:(n-1) 创建一个序列,一个从零到n-1 的整数向量。但是,您的 n 本身就是一个向量,因为它被定义为 term - timetime 是一个所有整数 0 到 40 的向量(因此它包含 41 个元素)。所以只有n 的第一个元素用于创建序列。例如,如果 nc(4,5,10),则只使用 4,忽略 5 和 10,0:(n-1) 将返回 c(0,1,2,3)

您需要重新定义 AnU()TWa() 函数。我不确定您到底需要什么,但我认为您可以将for (k in 0:(n-1)) 替换为for (k in 0:(max(n)-1))。我想对此进行测试,但无法重现您的错误,因为两个函数的公式中的对象 lx 未在您的代码中定义。

【讨论】:

  • 这已经很清楚了,非常感谢。您推荐的更改已对警告进行了排序,这很棒!完全忘记包含 lx 对象 - 我在那里道歉
  • 欢迎来到stackoverflow!如果此答案解决了您的问题,请点赞和/或接受。
  • 另一个提示:如果您的问题中有忘记包含lx 之类的错误,您可以编辑问题以解决该问题,以供将来参考。如果其他人稍后查看此问题并想要重现您的代码,这样做可能会有所帮助。
猜你喜欢
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 2020-03-21
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多