采样对数正态分布到精确均值和sd

时间:2019-06-30 00:35:57

标签: r

我已经通过设置meansd的参数(通过反复试验)对对数正态分布进行采样来准备向量,因此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)应用什么函数或程序包。

2 个答案:

答案 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()也是一个函数...