我想在R中生成一个已知参数的截断正态分布。注意,我没有寻找伪随机数生成器。
假设我有一个正态分布,平均值为5,标准差为1.我可以绘制截断正态分布的值,在第1点和第10点截断吗?
答案 0 :(得分:2)
以下函数会为任何分布生成(伪)随机数,只要您同时拥有' d'和' p'功能可用。在R
用语中,这意味着您必须拥有dnorm
和pnorm
,他们才能使用R
。
#
# random numbers for truncated distribution
#
rtrunc <- function(n, distr, lower = -Inf, upper = Inf, ...){
makefun <- function(prefix, FUN, ...){
txt <- paste(prefix, FUN, "(x, ...)", sep = "")
function(x, ...) eval(parse(text = txt))
}
if(length(n) > 1) n <- length(n)
pfun <- makefun("p", distr, ...)
qfun <- makefun("q", distr, ...)
lo <- pfun(lower, ...)
up <- pfun(upper, ...)
u <- runif(n, lo, up)
qfun(u, ...)
}
# Example:
x <- rtrunc(1, "norm", lower = 0, mean = 2, sd = 5)
答案 1 :(得分:1)
我找到了解决这个问题的方法。
这可以使用如juan之前建议的truncnorm包中的dtruncnorm函数来完成。我将使用正态分布问题中的示例来证明这一点,其中均值为5,标准差为1,限制为1和10。
首先,你必须创建一个从分布中绘制的点数的向量,它将是等间距的。因此,例如,如果您想从等分布中均匀地绘制十个点,那么您的向量(&#34; vec&#34;)将是:
vec=seq(from=1,by=1,length.out = 10)
以上将确保我们从1开始绘制10个点,递增1,最多值10。
然后我们将它们放在dtruncnorm()函数中并将其保存在&#34; test&#34;变量,然后绘制它:
test=dtruncnorm(vec,a=1,b=10,mean=5,sd=1)
plot(test)
如您所见,这绘制了离散点处的密度。您可以通过增加点数来轻松尝试使绘图连续:
vec=seq(from=1,by=0.1,length.out = 100)
test=dtruncnorm(vec,a=1,b=10,mean=5,sd=1)
plot(test)
如果您有任何问题,请发表评论