在R语言中生成均值为0、方差为1的标准化对数正态分布数据
生成均值为0、方差为1的对数正态分布数据(R语言)
首先明确对数正态分布的核心性质:若随机变量 ( X \sim \text{LN}(\mu, \sigma^2) )(即 ( \ln(X) ) 服从均值为 ( \mu )、方差为 ( \sigma^2 ) 的正态分布),则:
- 算术均值:( \mu_X = \exp\left(\mu + \frac{\sigma^2}{2}\right) )
- 算术方差:( \sigma_X^2 = \left(\exp(\sigma^2) - 1\right) \cdot \exp\left(2\mu + \sigma^2\right) )
- 算术标准差:( \sigma_X = \sqrt{\left(\exp(\sigma^2) - 1\right) \cdot \exp\left(2\mu + \sigma^2\right)} )
要得到均值为0、方差为1的标准化变量,需对原始对数正态变量做变换:( Y = \frac{X - \mu_X}{\sigma_X} )
修正后的代码
以你最初使用的 ( \mu=0 )、( \sigma=1 )(对应rlnorm函数的meanlog=0、sdlog=1参数)为例,正确的标准化实现如下:
# 生成原始对数正态数据 x <- rlnorm(n = 100000, meanlog = 0, sdlog = 1) # 计算原始分布的均值和标准差 mu_x <- exp(0 + 1^2 / 2) sigma_x <- sqrt((exp(1^2) - 1) * exp(2*0 + 1^2)) # 标准化得到均值0、方差1的数据 y <- (x - mu_x) / sigma_x # 验证结果 mean(y) # 输出接近0 var(y) # 输出接近1
原代码的问题
你之前的分母使用了原始分布的方差值 ( \exp(1) \cdot (\exp(1)-1) ),但标准化需要除以标准差(方差的平方根)。这会导致最终变量的方差变为 ( \frac{1}{\text{原方差}} ),远小于1,这就是样本方差达不到1的直接原因。
内容的提问来源于stack exchange,提问作者Dylan Dijk
相关产品推荐
相关产品推荐

