在 R 中绘制废墟
Plotting ruin in R
我正在尝试使用 R 重新创建类似于现代精算风险理论中的图像:https://www.academia.edu/37238799/Modern_Actuarial_Risk_Theory(第 89 页)
Click here for image
在我的例子中,水滴的大小基于参数为 1/2000 的指数分布,并且它们以泊松到达间隔时间间隔开,这意味着它们呈指数分布,速率参数为 0.25(在我的模型中)
U 的值由初始盈余加上每单位时间的保费收入 (c)(对于由到达间隔分布确定的时间量)减去从指数分布中随机获得的索赔金额给出上面提到了。
我觉得需要使用一个循环,这是我目前所拥有的:
lambda <- 0.25
EX <- 2000
theta <- 0.5
c <- lambda*EX*(1+theta)
x <- rexp(1, 1/2000)
s <- function(t1){for(t1 in 1:10){v <- c(rep(rexp(t1,1/2000)))
print(sum(v))}}
u <- function(t){10000+c*t}
plot(u, xlab = "t", xlim = c(-1,10), ylim = c(0,20000))
abline(v=0)
for(t1 in 1:10){v <- c(rep(rexp(t1,1/2000)))
print(sum(v))}
最终目标是 运行 这个模拟在 10 年的跨度内说 10,000 次,并将其用作保险公司破产率的可见表示。
感谢任何帮助。
我想你正在寻找这样的东西,所有这些都包含在一个默认绘制情节的简洁函数中,但如果只需要returns“毁灭”或“安全”,那么你可以运行 模拟中:
simulate_ruin <- function(lambda = 0.25, EX = 2000,
theta = 0.5, initial_amount = 10000,
max_time = 10, draw = TRUE) {
income_per_year <- lambda * EX * (1 + theta)
# Simulate a Poisson process. Include the initial time 0,
# and replicate every other time point so we have values "before" and
# "after" each drop
times <- c(0, rep(cumsum(rexp(1000, lambda)), each = 2))
times <- c(times[times < max_time], max_time)
# This would be our income if there were no drops (a straight line)
total_without_drops <- initial_amount + (income_per_year * times)
# Now simulate some drops.
drop_size <- rexp((length(times) - 1) / 2, 1/2000)
# Starting from times[3], we apply our cumulative drops every second index:
payout_total <- rep(c(0, cumsum(drop_size)), each = 2)
total <- total_without_drops - payout_total
if(draw) {
plot(times, total, type = "l", ylim = c(-1000, 20000))
abline(h = 0, lty = 2)
} else {
if(any(total < 0))
return("ruin")
else
return("safe")
}
}
所以我们可以调用一次进行模拟:
simulate_ruin()
再次进行不同的模拟
simulate_ruin()
和table10000次模拟结果求出破产率,原来是3%左右
table(sapply(1:10000, function(x) simulate_ruin(draw = FALSE)))
#>
#> ruin safe
#> 305 9695
由 reprex package (v2.0.1)
于 2022-04-06 创建
我正在尝试使用 R 重新创建类似于现代精算风险理论中的图像:https://www.academia.edu/37238799/Modern_Actuarial_Risk_Theory(第 89 页)
Click here for image
在我的例子中,水滴的大小基于参数为 1/2000 的指数分布,并且它们以泊松到达间隔时间间隔开,这意味着它们呈指数分布,速率参数为 0.25(在我的模型中)
U 的值由初始盈余加上每单位时间的保费收入 (c)(对于由到达间隔分布确定的时间量)减去从指数分布中随机获得的索赔金额给出上面提到了。
我觉得需要使用一个循环,这是我目前所拥有的:
lambda <- 0.25
EX <- 2000
theta <- 0.5
c <- lambda*EX*(1+theta)
x <- rexp(1, 1/2000)
s <- function(t1){for(t1 in 1:10){v <- c(rep(rexp(t1,1/2000)))
print(sum(v))}}
u <- function(t){10000+c*t}
plot(u, xlab = "t", xlim = c(-1,10), ylim = c(0,20000))
abline(v=0)
for(t1 in 1:10){v <- c(rep(rexp(t1,1/2000)))
print(sum(v))}
最终目标是 运行 这个模拟在 10 年的跨度内说 10,000 次,并将其用作保险公司破产率的可见表示。
感谢任何帮助。
我想你正在寻找这样的东西,所有这些都包含在一个默认绘制情节的简洁函数中,但如果只需要returns“毁灭”或“安全”,那么你可以运行 模拟中:
simulate_ruin <- function(lambda = 0.25, EX = 2000,
theta = 0.5, initial_amount = 10000,
max_time = 10, draw = TRUE) {
income_per_year <- lambda * EX * (1 + theta)
# Simulate a Poisson process. Include the initial time 0,
# and replicate every other time point so we have values "before" and
# "after" each drop
times <- c(0, rep(cumsum(rexp(1000, lambda)), each = 2))
times <- c(times[times < max_time], max_time)
# This would be our income if there were no drops (a straight line)
total_without_drops <- initial_amount + (income_per_year * times)
# Now simulate some drops.
drop_size <- rexp((length(times) - 1) / 2, 1/2000)
# Starting from times[3], we apply our cumulative drops every second index:
payout_total <- rep(c(0, cumsum(drop_size)), each = 2)
total <- total_without_drops - payout_total
if(draw) {
plot(times, total, type = "l", ylim = c(-1000, 20000))
abline(h = 0, lty = 2)
} else {
if(any(total < 0))
return("ruin")
else
return("safe")
}
}
所以我们可以调用一次进行模拟:
simulate_ruin()
再次进行不同的模拟
simulate_ruin()
和table10000次模拟结果求出破产率,原来是3%左右
table(sapply(1:10000, function(x) simulate_ruin(draw = FALSE)))
#>
#> ruin safe
#> 305 9695
由 reprex package (v2.0.1)
于 2022-04-06 创建