如何在R语言中的循环中找到最大值

6
我有一个表达式。
 qbinom(0.05, n, .47) - 1 

我希望创建一个循环,对n值在(20,200)范围内进行迭代。对于每次循环,该函数会产生一个数字。我希望取这180个数字中的最大值。因此,代码类似于:

 for (n in 20:200) {
   max(qbinom(0.05, n, .47)-1)

但我不确定如何确切地做到这一点。

谢谢!


@ZheyuanLi 最好作为答案,而不是评论。 - zacdav
不过这里并不重要,更具代表性的代码应该是 max(qnorm(0.05, 20:200, 0.47)-1) - Chris
20:200是181个数字,不是180个。 - Glen_b
1个回答

6

首先,我将向您展示如何使用循环来完成此操作。

n <- 20:200
MAX = -Inf    ## initialize maximum
for (i in 1:length(n)) {
  x <- qbinom(0.05, n[i], 0.47) - 1
  if (x > MAX) MAX <- x
  }

MAX
# [1] 81

注意,我不会记录生成的所有181个值。每个值都被视为临时值,并将在下一次迭代中被覆盖。最终,我们只有一个单一的值 MAX
如果您想同时保留所有记录,我们需要先初始化一个向量来保存它们。
n <- 20:200
MAX = -Inf    ## initialize maximum
x <- numeric(length(n))    ## vector to hold record
for (i in 1:length(n)) {
  x[i] <- qbinom(0.05, n[i], 0.47) - 1
  if (x[i] > MAX) MAX <- x[i]
  }

## check the first few values of `x`
head(x)
# [1] 5 5 6 6 6 7

MAX
# [1] 81

现在我将展示矢量化的解决方案。

max(qbinom(0.05, 20:200, 0.47) - 1)
# [1] 81

与概率分布相关的R函数都采用相同的向量化方式。对于与二项分布相关的函数,可以阅读?rbinom获取详细信息。

需要注意的是,向量化是通过循环利用规则实现的。例如,可以通过指定:

qbinom(0.05, 1:4, 0.47)

R将首先进行循环利用:

   p: 0.05    0.05    0.05    0.05
mean:    1       2       3       4
  sd: 0.47    0.47    0.47    0.47

然后进行评估

qbinom(p[i], mean[i], sd[i])

通过C级别循环实现。


后续跟进

如何知道在向量化解决方案中哪个数字对应最大的20:200?

我们可以使用

x <- qbinom(0.05, 20:200, 0.47) - 1
i <- which.max(x)
# [1] 179

注意,i 是向量 20:200 中的位置。要获得您想要的 n ,您需要:

(20:200)[i]
# 198

最大值
x[i]
# [1] 81

谢谢!使用向量化解决方案,我如何知道哪个20:200中的最大值对应哪个? - roc11111111
但是这里没有qnorm,我有的是qbinom。也就是说,我正在尝试找到最大值n和相应的k,使得获得至多k个n的概率尽可能接近0.05。K是表达式qbinom(0.05, n, 0.47) - 1的输出。 - roc11111111
如果我执行max(qbinom(0.05, 20:200, 0.47) - 1),输出结果为81。这意味着我的k值为81,但我是否有办法找出它对应的n值是20到200之间的哪一个? - roc11111111

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