在尝试为我的 R 课程构建保险模型时,我发现 Rstudio 停止执行代码,没有给出任何错误。 例如,我有分配变量的部分:
payout_reserve <- probab/12*T*N*F
Result = W-payout_reserve
a <- (N*probab)/12
St <- payout_reserve - ( a * F )
当它不包含在循环中时执行(运行选定的行),但是当它包含在循环中时不会执行(参见下面标记为粗体的代码):
K<-200 #monthly payment
F<-40000 #potential payout
T<-2 # no of months
probab<-0.03 # 3% probability of payout
#1st period
t<-1
#W=money inflow
**for (t in 1:T) {
W <-K*N*T }
#A
#simulation function:
simulation<-function(N, K, F, T,probab) {
for (t in 1:T) {
payout_reserve <- probab/12*T*N*F
#difference between inflow and outflow
Result = W-payout_reserve
#B. number of payouts
a <- (N*probab)/12
#C. insurance payout
St <- payout_reserve - ( a * F )**
#D. liquidity check
n <- sample(0:100, 1) #random number – new customers (0-100)
o <- sample(0:90, 1) #random number – resigning customers (0-100)
if(St>=0){
print("sufficient liquidity")
N=N+n-o-a
} else if (St<0) {
print ("no liquidity")
stop("stop")
}
#E. t=t+1
inc <- function(t) {eval.parent(substitute(t <- t + 1))}
inc(t)
#F. if 𝑡 ≤ 𝑇, go to point 2, otherwise exit
while (t <= T) {
if(t == T){
break
}
next
}
}
}
simulation(N=10000, K=200, F=30000, T=2,probab=0.03)
你能告诉我发生了什么事吗?为什么循环不执行所有代码?
另外,您能否建议如何将迭代结果存储在列表中? 我想在每次迭代后得到一个 St 值列表......
有一些问题
在simulation()函数内部,使用了变量
W
,但没有使用
定义在循环中。它是在外部的单独循环中定义的
函数 (W <- KNT),由于以下原因,它不适用于函数内部
范围界定。
while (t <= T)
循环可能导致无限循环,因为 t 不是
正确更新循环内。你应该直接增加 t
在 for loop
中而不是使用 while 循环。
下一条语句在 while 循环中放错了位置,这可能会 阻止循环按预期运行。
为了存储迭代结果,需要初始化一个列表(或者 另一个数据结构)在循环之外并向其附加 St 值 在每次迭代期间,然后使用
return
输出它
当流动性不足时,
stop()
函数会停止整个执行
不足的。如果这是故意的,那很好,但它会终止
整个模拟立即完成。
这是更正后的代码:
# Simulation function
simulation <- function(N, K, F, T, probab) {
# Initialize variables
t <- 1 # Start period
W <- K * N * T # Initial money inflow
St_values <- list() # List to store St values for each iteration
for (t in 1:T) {
# A. Payout reserve
payout_reserve <- probab / 12 * T * N * F
# B. Difference between inflow and outflow
Result <- W - payout_reserve
# C. Number of payouts
a <- (N * probab) / 12
# D. Insurance payout
St <- payout_reserve - (a * F)
# Store `St` in the list
St_values[[t]] <- St
# E. Liquidity check
n <- sample(0:100, 1) # Random new customers
o <- sample(0:90, 1) # Random resigning customers
if (St >= 0) {
print("sufficient liquidity")
N <- N + n - o - a
} else {
print("no liquidity")
stop("Simulation stopped due to insufficient liquidity.")
}
# F. Increment time (handled by the for loop)
}
# Return the list of St values
return(St_values)
}
# Run the simulation
result <- simulation(N = 10000, K = 200, F = 30000, T = 2, probab = 0.03)
St_df <- data.frame(period = 1:length(result), St = unlist(result))
print(St_df)