为什么R语言中相同输入向量传入函数会得到不同的返回值?
问题原因
核心原因是你对b函数做mu0向量化的逻辑,会触发b函数内的随机数据生成逻辑重复执行:
- 你通过
Vectorize(b, vectorize.args = c("mu0"))将函数改造为支持mu0向量输入,本质是对mu0的每一个元素,都完整运行一次b函数的全部代码 b函数内部第一行写了data <- rnorm(n),每次运行b函数都会生成一套全新的正态分布随机样本- 样本不同,后续计算得到的上下界
lb/ub、uniroot求解的目标函数结果都会变化,最终得到的lambda值自然不同。
如果要保证所有mu0分量对应的lambda值相同,只需要把随机数据生成逻辑移到函数外部,保证每次计算用的是同一套样本即可,修改后的参考代码如下:
mu <- 0 n <- 100 # 提前生成固定样本,仅生成一次 fixed_data <- rnorm(n) b <- function(n, mu, data, mu0) { f <- function(data, lambda, mu) { sum((data - mu) / (1 + lambda * (data - mu))) } f <- Vectorize(f, vectorize.args = c("lambda")) lb <- (1 - 1 / n) / (mu - max(data)) ub <- (1 - 1 / n) / (mu - min(data)) lambda <- unlist(uniroot(f, interval = c(lb, ub), data = data, mu = mu)[1]) lambda * mu0 } b <- Vectorize(b, vectorize.args = c("mu0")) # 调用时传入固定样本 b(mu0 = rep(1, 20), mu = mu, n = n, data = fixed_data)
内容的提问来源于stack exchange,提问作者Noflowzone
相关产品推荐
相关产品推荐

