3

我第一次在这里发帖。

我的数据类似于以下示例:

C1 C2 C3 C4
1 1.33 1.86 1.91 2.51
2 1.54 1.74 1.98 2.25
3 1.75 1.97 2.20 2.59

我想找到一个参数值 (x),使得每行小于 x 的值的平均数最接近 1。例如,对于上述数据,我知道 x = 1.75 给了我想要的 x 值。但是,当我有 1,000 行和 100 列时,我想使用 R 来查找它。

x = 1.75
dataset.counts <- rowSums(dataset[,] < x)
dataset.counts
[1] 1 2 0
mean(dataset.counts)
[1] 1

我可以使用 optim() 找到 x 吗?

4

2 回答 2

2

我对 R 一无所知。但我可以告诉你一个通用算法,它将在 O(n logn) 中运行,其中 n 是数据点的数量(对于具有 1000 万个数字的数据集,应该在一秒钟内运行) .

  1. 将所有元素存储在一个数组中a
  2. 种类a
  3. 制作变量xx_idx
  4. i在 [0, n-1] 范围内运行二进制搜索。
  5. 在搜索的每一步:
    • 遍历每一行并计算该行中小于或等于的元素数a[i]
    • 设置mean为总数除以行数。
    • 如果mean比 更接近 1 x,则设置x_idxi并设置xa[x_idx]
    • 如果mean小于 1,则将搜索限制在上半部分。
    • 否则,如果mean大于 1,则将搜索限制在下半部分。
    • else ifmean是 1 次中断;
  6. 返回 x;
于 2013-07-19T02:31:09.553 回答
2

@Glen_b,谢谢。我正在为使用 uniroot 对我非常有用的代码发布控制台。非常感谢您的帮助。

数据集
R1 R2 R3 R4
1 1.33 1.86 1.91 2.51
2 1.54 1.74 1.98 2.25
3 1.75 1.97 2.20 2.59

f <- function(x){
+ 1 - mean(rowSums(dataset[,] < x))
+ }

uniroot(f, c(0,6), tol= 1e-10)
$root
[1] 1.747159

$f.root
[1] 0

$iter
[1] 8

$estim.prec
[1] 0.008522727

于 2013-07-19T11:56:41.103 回答