You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言循环中为每次迭代添加递进因子的实现求助

问题:扩展循环中的乘积计算范围

示例数据

DefaultSurvivalLoanID
0.90.11
0.850.152
0.920.083
0.860.144
0.70.35
0.820.186

原R代码

TD <- character() 
TD
for(i in 1:n) {

PD_2 <- prod(credit$Survival[1:n])*credit$Default[i]/credit$survival[i]*credit$Default[i+1]/credit$Survival[i+1]

TD <- c(TD, PD_2)

}

credit$TD <- as.numeric(TD)

需求说明

当前代码仅包含了credit$Default[i+1]/credit$Survival[i+1]这一项,需要将计算逻辑扩展为:对从i+1到i+n-1的所有credit$Default[k]/credit$Survival[k]值求乘积,最终计算式应为:

prod(credit$Survival[1:n]) * credit$Default[i]/credit$Survival[i] * prod(credit$Default[k]/credit$Survival[k] for k in i+1 to i+n-1)

解决方案

方法1:循环内直接计算区间乘积

先修正原代码的小写拼写错误(credit$survival改为credit$Survival),同时处理索引越界问题,直接在循环内用prod()计算指定范围的乘积:

# 定义n为数据框行数
n <- nrow(credit)
# 直接初始化数值向量,避免字符转数值的额外开销
TD <- numeric(n)

for(i in 1:n) {
  # 确定乘积的起止索引,防止超出数据范围
  k_start <- i + 1
  k_end <- min(i + n - 1, n)
  
  # 当起始索引大于结束索引时,乘积因子设为1(无项相乘时乘积为1)
  prod_factor <- if(k_start > k_end) 1 else prod(credit$Default[k_start:k_end] / credit$Survival[k_start:k_end])
  
  # 计算最终PD_2值
  PD_2 <- prod(credit$Survival[1:n]) * (credit$Default[i] / credit$Survival[i]) * prod_factor
  
  TD[i] <- PD_2
}

credit$TD <- TD

方法2:预计算累积乘积提升效率

如果数据量较大,循环内重复调用prod()会影响性能,可以先预计算累积乘积,快速推导区间乘积:

n <- nrow(credit)
# 预计算每个行的Default/Survival比值
ratio <- credit$Default / credit$Survival
# 计算累积乘积,cum_prod[i]表示ratio[1]到ratio[i]的乘积,开头补1方便区间计算
cum_prod <- c(1, cumprod(ratio))
# 预计算Survival列前n项的乘积
surv_prod <- prod(credit$Survival[1:n])

TD <- numeric(n)
for(i in 1:n) {
  k_start <- i + 1
  k_end <- min(i + n - 1, n)
  
  # 区间乘积 = 截止到k_end的累积乘积 / 截止到k_start-1的累积乘积
  prod_factor <- if(k_start > k_end) 1 else cum_prod[k_end + 1] / cum_prod[k_start]
  
  PD_2 <- surv_prod * ratio[i] * prod_factor
  
  TD[i] <- PD_2
}

credit$TD <- TD

内容的提问来源于stack exchange,提问作者Chris M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:57:20