在R循环中存储多rho值下函数优化的输出向量
解决循环中优化结果被覆盖的问题
我来帮你搞定这个问题!你遇到的核心问题是循环里反复用同一个变量名o和n存储结果,导致之前的优化结果都被新值覆盖了。咱们可以用R里的列表来存储每个rho对应的结果,同时还能优化一下函数的写法,避免全局变量的潜在坑。
第一步:优化目标函数,传入rho参数
你的原函数fr直接引用了全局环境中的rho,这在循环里容易出意外(比如后续修改rho值会影响函数结果)。咱们把rho作为参数传入函数:
fr <- function(Z, rho) { delta <- pnorm((Matrix81fulld$CumZavg - sqrt(rho)*Z)/sqrt(1-rho)) - pnorm((Matrix81fulld$CumZavgLow - sqrt(rho)*Z)/sqrt(1-rho)) sum((Matrix81fulld$n*(Matrix81fulld$Prob1981 - delta)^2)/((delta*(1-delta)))) }
第二步:预定义存储结果的容器
我们用两个列表分别存储optimize和nlm的结果,提前给列表命名还能方便后续按rho值查询:
# 定义要遍历的rho值 rho_values <- c(0.01, 0.025, 0.05, 0.1, 0.15, 0.2, 0.3) # 创建空列表,预分配长度和rho_values一致,提升运行效率 opt_results <- vector("list", length(rho_values)) nlm_results <- vector("list", length(rho_values)) # 给列表元素命名为对应的rho值 names(opt_results) <- rho_values names(nlm_results) <- rho_values
第三步:修改循环,逐个存储结果
用索引遍历rho值,把每个rho对应的优化结果存入列表的对应位置:
for (i in seq_along(rho_values)) { current_rho <- rho_values[i] # 运行optimize,记得传递rho参数 current_opt <- optimize(fr, interval = c(-2, 2), rho = current_rho) # 运行nlm,同样传递rho参数 current_nlm <- nlm(fr, p = 0, rho = current_rho) # 将结果存入列表 opt_results[[i]] <- current_opt nlm_results[[i]] <- current_nlm }
第四步:查看和使用结果
现在你可以轻松查看每个rho对应的结果了:
- 查看rho=0.05的optimize结果:
opt_results[["0.05"]] - 查看rho=0.3的nlm结果:
nlm_results[["0.3"]]
如果想把结果整理成更易读的数据框,可以用dplyr工具:
library(dplyr) # 把optimize的结果转换成数据框 opt_df <- bind_rows(opt_results, .id = "rho") %>% mutate(rho = as.numeric(rho)) # 打印数据框 print(opt_df)
这样每个rho对应的优化结果就都被妥善保存下来,不会再被覆盖啦!
内容的提问来源于stack exchange,提问作者jgor33
相关产品推荐
相关产品推荐

