我已经通过设置mean
和sd
的参数(通过反复试验)对对数正态分布进行采样来准备向量,因此rlnorm()
恰好返回了根据以下示例,任意指定的随机set.seed()
的平均值为20 和 sd为6 (小数点后3位)...
# 10,000 samples from log-normal distribution
set.seed(7)
HcT <- rlnorm(n = 10000, log(19.147), log(1.33832))
# Report mean and sd
paste('The mean of HcT is',round(mean(HcT),3),'and the SD is',round(sd(HcT),3))
[1] "The mean of HcT is 20 and the SD is 6"
但是,我要尝试两个目标而不是反复试验。 single value goal seek有几个堆栈溢出示例,但是我不确定要针对两个参数的情况(上述示例中的均值和SD)应用什么函数或程序包。
答案 0 :(得分:3)
应该可以正常工作,以最小化与目标值的平方偏差之和。这种方法有一些陷阱(例如,请参见Press等人的数字食谱),但对于简单的问题应该可以。出现以下代码,以检索适合您情况的正确答案:
f <- function(p,seed=7,target=c(20,6)) {
mu <- log(p[1])
sd <- log(p[2])
set.seed(seed)
r <- rlnorm(1e4,mu,sd)
sum((c(mean(r),sd(r))-target)^2)
}
选择一些非荒谬的起始值({15,2}):
optim(par=c(15,2), fn=f)
基于@Cole的答案,我会认为这会完美地起作用:绘制法向偏差,对其进行变换,使其均值和sd 精确等于对数刻度值,然后求幂。但这仅适用于平均或渐近(即大样本收敛至期望的均值),不适用于有限样本。还没想清楚为什么会这样。
rlnorm_exact <- function(n, m, sd) {
m2 <- log(m^2 / sqrt(sd^2 + m^2))
sd2 <- sqrt(log(1 + (sd^2 / m^2)))
r <- c(scale(rnorm(n)))
return(exp(sd2*r+m2))
}
答案 1 :(得分:0)
我以前也遇到过这个问题,下面的链接使我很直率。 rlnorm()
不仅只是使用算术平均值和标准差的对数。相反,该函数需要特定于对数正态分布的mu和sigma。
非常感谢this link的人们为我们提供了公式,可以转换为对数正态分布。
我要使它不太漂亮,以便人们在解决此问题时转到上面的链接:
m <- 20
s <- 6
data_set <- rlnorm(n=1000000,
meanlog=log(m^2 / sqrt(s^2 + m^2)),
sdlog=sqrt(log(1 + (s^2 / m^2))))
mean(data_set)
sd(data_set)
编辑:将变量从sd
更改为s
,因为sd()
也是一个函数...