我有一组大致均匀分布的模拟数据。我想对这些数据的一个子集进行采样,并为该子集提供一个对数正态分布,其中包含我指定的(log)均值和(log)标准差。
我可以找出一些缓慢的暴力方法来做到这一点,但我觉得应该有一种方法可以使用plnorm
函数和sample
函数在几行中完成" prob"变量集。我似乎无法得到我正在寻找的行为。我的第一次尝试是这样的:
probs <- plnorm(orig_data, meanlog = mu, sdlog = sigma)
new_data <- sample(orig_data, replace = FALSE, prob = probs)
我认为我误解了plnorm
函数的行为方式。提前谢谢。
答案 0 :(得分:1)
如果您的orig_data
均匀分布在0和1之间,那么
new_data = qlnorm(orig_data, meanlog = mu, sdlog = sigma)
将提供日志采样数据。如果您的数据不在0和1之间,但请先说出a
和b
,那么首先:
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
是我想要重新采样到对数正态分布的数据列。请注意,meanlog
和sdlog
中的log(10)因子是因为我希望分布在基数10中是对数正态的,而不是自然对数。