如何在 R 中绘制具有已知参数的截断正态分布
How to plot a truncated normal distribution with known paramters, in R
我想在任一 R 中生成具有已知参数的截断正态分布。请注意,我不是在寻找伪随机数生成器。
假设我有一个均值为 5 且标准差为 1 的正态分布。我可以绘制截断正态分布的值,在点 1 和 10 截断吗?
只要您同时使用 '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)
我找到了解决这个问题的方法。
这可以使用 truncnorm 包中的 dtruncnorm 函数来完成,正如 juan 先前所建议的那样。我将使用均值为 5、标准差为 1 且极限为 1 和 10 的正态分布问题中的示例来证明这一点。
首先,您必须创建一个矢量,其中包含要根据分布绘制的点数,该矢量将等距分布。因此,例如,如果您想从分布中等距绘制十个点,您的向量 ("vec") 将是:
vec=seq(from=1,by=1,length.out = 10)
以上将确保我们绘制 10 个点,从 1 开始,递增 1,直到值 10。
然后我们将这些放在 dtruncnorm() 函数中并将其保存在 "test" 变量中,然后绘制它:
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)
有问题请评论
我想在任一 R 中生成具有已知参数的截断正态分布。请注意,我不是在寻找伪随机数生成器。
假设我有一个均值为 5 且标准差为 1 的正态分布。我可以绘制截断正态分布的值,在点 1 和 10 截断吗?
只要您同时使用 '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)
我找到了解决这个问题的方法。
这可以使用 truncnorm 包中的 dtruncnorm 函数来完成,正如 juan 先前所建议的那样。我将使用均值为 5、标准差为 1 且极限为 1 和 10 的正态分布问题中的示例来证明这一点。
首先,您必须创建一个矢量,其中包含要根据分布绘制的点数,该矢量将等距分布。因此,例如,如果您想从分布中等距绘制十个点,您的向量 ("vec") 将是:
vec=seq(from=1,by=1,length.out = 10)
以上将确保我们绘制 10 个点,从 1 开始,递增 1,直到值 10。
然后我们将这些放在 dtruncnorm() 函数中并将其保存在 "test" 变量中,然后绘制它:
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)
有问题请评论