R将数据重采样到对数正态分布

时间:2015-02-19 15:50:41

标签: r resampling

我有一组大致均匀分布的模拟数据。我想对这些数据的一个子集进行采样,并为该子集提供一个对数正态分布,其中包含我指定的(log)均值和(log)标准差。

我可以找出一些缓慢的暴力方法来做到这一点,但我觉得应该有一种方法可以使用plnorm函数和sample函数在几行中完成" prob"变量集。我似乎无法得到我正在寻找的行为。我的第一次尝试是这样的:

probs <- plnorm(orig_data, meanlog = mu, sdlog = sigma)
new_data <- sample(orig_data, replace = FALSE, prob = probs)

我认为我误解了plnorm函数的行为方式。提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果您的orig_data均匀分布在0和1之间,那么

new_data = qlnorm(orig_data, meanlog = mu, sdlog = sigma)

将提供日志采样数据。如果您的数据不在0和1之间,但请先说出ab,那么首先:

orig_data = (orig_data-a)/(b-a)

一般来说,0到1之间的均匀RV被视为概率,所以如果你想用给定的分布进行采样,你必须使用q...即取相应的分位数

答案 1 :(得分:0)

谢谢大家的建议。虽然他们让我接近,但我已经为我的特定问题决定采用略有不同的方法,我将其作为解决方案发布,以防其他人使用。

我遗漏原始问题的一个具体问题是我有一个完整的数据集(存储为数据框),我想从该集合重新取样行,使得其中一个变量(列)是对数正常的分散式。以下是我为实现此目的而编写的函数,它依赖dlnorm计算概率,sample重新采样数据框:

resample_lognorm <- function(origdataframe,origvals,meanlog,sdlog,n) {
  prob <- dlnorm(origvals,meanlog=log(10)*meanlog,sdlog=log(10)*sdlog)
  newsamp <- origdataframe[sample(nrow(origdataframe),
                                  size=n,replace=FALSE,prob=prob),]
  return(newsamp)
}

在这种情况下,origdataframe是我想要采样的完整数据框,而originals是我想要重新采样到对数正态分布的数据列。请注意,meanlogsdlog中的log(10)因子是因为我希望分布在基数10中是对数正态的,而不是自然对数。