在R语言循环中为每次迭代添加递进因子的实现求助
问题:扩展循环中的乘积计算范围
示例数据
| Default | Survival | LoanID |
|---|---|---|
| 0.9 | 0.1 | 1 |
| 0.85 | 0.15 | 2 |
| 0.92 | 0.08 | 3 |
| 0.86 | 0.14 | 4 |
| 0.7 | 0.3 | 5 |
| 0.82 | 0.18 | 6 |
原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
相关产品推荐
相关产品推荐

