2013-07-19 43 views
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給了我des x的價值。但是,當我有1000行和100列的時候,我想用R來找到它。

X = 1.75
dataset.counts < - rowSums(數據集[,] < X)
dataset.counts
[1] 1個2 0
平均值(dataset.counts)
[1 ] 1

我可以使用optim()來查找x嗎?

+2

你可以做到這一點,但因爲你發現一個零(即你計算的平均值減去你所尋找的參數爲零或接近它),更明顯的功能是「uniroot」。 –

+2

@Glen_b,謝謝,它工作。我用下面的代碼:

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< - 函數(X){ + 1 - 平均值(rowSums(數據集[,] > uniroot(F,C(0,6),TOL = 1E-10) $根 [1] 1.747159 $ f.root [1] 0 $ iter [1] 8 $ estim.prec [1] 0.008522727 –

+2

代碼在評論中看起來不正確。也許你可以把它寫成答案。我會贊成它。 –

回答

2

@Glen_b,thanks。我發佈了使用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< - 函數(X){
+ 1 - 平均值(rowSums(數據集[,] < x))
+}

uniroot(F,C(0,6),TOL = 1E-10)
$根
[1] 1.747159

$ f.root
[1] 0

$ ITER
[1] 8

$ estim.prec
[1] 0.008522727

+0

這就是+1。 –

2

我對R沒有任何瞭解。但是我可以告訴你一個在O(n logn)中運行的通用算法,其中n是數據點的數量(對於數據集應該在一秒之內運行1000萬數字)。

  1. 存儲陣列中的全部a
  2. 的元素排序a
  3. 使變量xx_idx
  4. 在範圍上運行i二進制搜索[0,N-1]以下。
  5. 在搜索的每個步驟:
    • 通過每一行的運行和計數該行中的元素數量是小於或等於a[i]
    • 設置mean總通過行數分開。
    • 如果meanx越接近1,設置x_idxi並設置xa[x_idx]
    • 如果mean小於1,將搜索範圍限制的上半部分。
    • 否則如果mean大於1,則將搜索限制在下半部分。
    • 否則如果mean是1中斷;
  6. return x;
+0

謝謝,亞歷克斯。我感謝你的迴應。 uniroot似乎在R中工作。如果遇到任何問題,我會嘗試解決您的問題。非常感激。 –