如何在R中生成负指数分布

4

今天我正在手动创建一个负指数分布,并试图找出更快/更容易的解决方案。首先,我手动制作了这样一个几何序列,不断地用 .60 乘以它直到接近零:

x <- 400
x*.60

我重复这个过程大约20次,得到了解的向量并绘制出分布图,如下所示:

y <- c(400,240,144,86.4, 51.84, 31.104, 18.6624, 11.19744, 6.718464, 4.031078,
       2.418647, 1.451188, .8707129, .5224278, .3134567, .188074, .1128444,
       .06770664, .04062398, .02437439)
plot(y)

在此输入图像描述

但是,我一直在努力想找到一个更简单的使用 seq 的方法,但我只知道如何使用算术序列来完成。 我尝试着重新制作下面的内容:

plot(seq(from=400,
    to=1,
    by=-.60))

很明显这样做并没有产生相同的效果,导致绘制出来的图形线性下降:

enter image description here

有更简单的解决方案吗?我想在R中这应该是一个相当基本的函数。
1个回答

5

你可以使用 dexp

(x <- dexp(1:20, rate=.5)*1000)
# [1] 303.26532986 183.93972059 111.56508007  67.66764162  41.04249931  24.89353418  15.09869171   9.15781944   5.55449827
# [10]   3.36897350   2.04338572   1.23937609   0.75171960   0.45594098   0.27654219   0.16773131   0.10173418   0.06170490
# [19]   0.03742591   0.02269996

plot(x)

enter image description here

为了使其在400处准确启动,我们可以使用optimize来最小化(400 - dexp(1, rate=.5)*x)^2
f <- function(x, a) (a - dexp(1, rate=.5)*x)^2
xmin <- optimize(f, c(0, 4000), a=400)

(x <- dexp(seq_len(20), rate=.5)*xmin$minimum)
# [1] 400.00000000 242.61226389 147.15177647  89.25206406  54.13411329  32.83399945  19.91482735  12.07895337   7.32625556
# [10]   4.44359862   2.69517880   1.63470858   0.99150087   0.60137568   0.36475279   0.22123375   0.13418505   0.08138735
# [19]   0.04936392   0.02994073

请注意,如果您需要不同的rate=,则应在optimize和创建值时都使用它。

1
我认为我大部分理解了那段代码,但是我有点困惑它如何从400开始评估。在这方面,将整个(x <- dexp(1:20, rate=.5)*1000)表达式放在括号中是否有特殊作用?我只见过没有括号定义对象的情况。 - Shawn Hemelstrand
1
@ShawnHemelstrand,你可以使用优化器来计算完美的乘数,参见更新的答案。额外的 (.) 只是在控制台中额外评估你正在分配的内容。 - jay.sf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接