2

Rで学術論文(引用の最後を参照)から統計的手法を実装しています。ループを使用せずにいずれかの手順を実行する方法があると思いますが、攻撃方法を決定するのに苦労しています。

このメソッドは、x、n、およびpの3つの変数を持つデータフレームで動作します。すべてのiに対してp[i]<= p [i+1]の場合にのみ動作します。ポイントのペアがそれに違反する場合は、p[i]とp[i + 1]の両方を加重平均(n [i] * p [i] + n [i + 1] * p)に設定することで平滑化されます。 [i + 1])/(n [i] + n [i + 1])この平滑化は、p_iが減少しないシーケンスになるまで繰り返されます。

このスムーズの問題は、a)Rのループの形式が正しくないこと、およびb)p_i> p_(i + 1)> = p_(i + 2)のように行に複数のポイントがある場合、メソッドが失敗する可能性があることです。終了するか、収束するのに非常に長い時間がかかります。たとえば、そのようなシーケンスが発生した場合:

x  n  p
2  10 0.6
5  10 0.5
10 10 0.5

Smoothは、pの最初の2つの値を0.55に設定し、次に2番目の値を0.525に設定し、最初の2つを0.5325に設定します。以下同様に、永久ループします(または、運が良ければ、数十億回の反復で重要度の限界に達します。 )。隣接する減少するデータポイントを識別し、それらをグループとして平均化することにより、数学的に同等であるがより効率的な方法があるはずですが、Rでそれにアプローチする方法がわかりません。

さらに背景が必要な場合は、問題の論文はMartin A. Hamilton、Rosemarie C. Russo、RobertV.Thurstonです。「毒性バイオアッセイにおける致死濃度の中央値を推定するためのトリミングされたスピアマン-カーバー法。」環境。科学 Technol。、1977、11(7)、pp 714–719。716ページの「最初のステップ」のセクションを参照しています。

4

2 に答える 2

2

アルゴリズムを理解しているので、減少している位置を特定し、これらのそれぞれから始めて、ブロックごとに更新できるようpに、(累積)加重平均が減少している時間を調べる必要があります。pある種のループなしでこれをどのように行うことができるかわかりません。いくつかの解決策は、ループを非表示にするlapplyか、同等のものですが、私見です。これは、古き良きループを好むほど複雑なアルゴリズムの1つです。効率が少し低下する可能性がありますが、コードはうまく読み取れます。whileループを使用した私の試み:

smooth.p <- function(df) {

   while (any(diff(df$p) < 0)) {

      # where does it start decreasing
      idx <- which(diff(df$p) < 0)[1]

      # from there, compute the cumulative weighted average
      sub <- df[idx:nrow(df), ]
      cuml.wavg <- cumsum(sub$n * sub$p) / cumsum(sub$n)

      # and see for how long it is decreasing
      bad.streak.len <- rle(diff(cuml.wavg) <= 0)$lengths[1]

      # these are the indices for the block to average
      block.idx <- seq(from = idx, length = bad.streak.len + 1)

      # compute and apply the average p
      df$p[block.idx] <- sum(df$p[block.idx] * df$n[block.idx]) /
                     sum(df$n[block.idx])
   }
   return(df)
}

あなたが提案したような大まかなパッチを含むいくつかのデータがあります:

df <- data.frame(x = 1:9,
                 n = rep(1, 9),
                 p = c(0.1, 0.3, 0.2, 0.6, 0.5, 0.5, 0.8, 1.0, 0.9))
df
#   x n   p
# 1 1 1 0.1
# 2 2 1 0.3
# 3 3 1 0.2
# 4 4 1 0.6
# 5 5 1 0.5
# 6 6 1 0.5
# 7 7 1 0.8
# 8 8 1 1.0
# 9 9 1 0.9

そして出力:

smooth.p(df)
#   x n         p
# 1 1 1 0.1000000
# 2 2 1 0.2500000
# 3 3 1 0.2500000
# 4 4 1 0.5333333
# 5 5 1 0.5333333
# 6 6 1 0.5333333
# 7 7 1 0.8000000
# 8 8 1 0.9500000
# 9 9 1 0.9500000
于 2012-07-11T01:53:06.633 に答える
0

上記のGlen_bに続いて、ハミルトンの論文に記載されているものはgpava、CRANパッケージのものと同等isotoneです。

于 2013-09-22T15:08:15.580 に答える