0

DF

 times a   b   s  ex  
1   0 59 140 1e-4  1
2  20 59 140 1e-4  0 
3  40 59 140 1e-4  0
4  60 59 140 1e-4  2
5 120 59 140 1e-4 20
6 180 59 140 1e-4 30
7 240 59 140 1e-4 31
8 360 59 140 1e-4 37
9   0 60 140 1e-4  0
10 20 60 140 1e-4  0
11 40 60 140 1e-4  0
12 60 60 140 1e-4  0
13 120 60 140 1e-4 3300
14 180 60 140 1e-4 6600
15 240 60 140 1e-4 7700
16 360 60 140 1e-4 7700
# dput(DF) 
structure(list(times = c(0, 20, 40, 60, 120, 180, 240, 360, 0, 
20, 40, 60, 120, 180, 240, 360), a = c(59, 59, 59, 59, 59, 59, 
59, 59, 60, 60, 60, 60, 60, 60, 60, 60), b = c(140, 140, 140, 
140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140
), s = c(1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 
1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04, 1e-04), ex = c(1, 
0, 0, 2, 20, 30, 31, 37, 0, 0, 0, 0, 3300, 6600, 7700, 7700)), .Names = c("times", 
"a", "b", "s", "ex"), row.names = c(NA, 16L), class = "data.frame")

DF2

prime    times       mean     
 g1          0  1.0000000 
 g1         20  0.7202642 
 g1         40  0.8000305 
 g1         60  1.7430986 
 g1        120 16.5172242 
 g1        180 25.6521268         
 g1        240 33.9140056 
 g1        360 34.5735984 
 #dput(DF2)
 structure(list(times = c(0, 20, 40, 60, 120, 180, 240, 360), 
mean = c(1, 0.7202642, 0.8000305, 1.7430986, 16.5172242, 
25.6521268, 33.9140056, 34.5735984)), .Names = c("times", 
"mean"), row.names = c(NA, -8L), class = "data.frame")

DF は、異なる 'ex' 値をもたらす 'a'、'b'、および 's' 値の何百もの組み合わせを実際に持つ大きなデータ フレームの例です。私がやりたいことは、「ex」値 (DF) が「平均」値 (DF2) に等しい「時間」で最もよく適合する「a」、「b」、および「s」の組み合わせを見つけることです。このフィッティングでは、一度に 8 つの値を比較します (つまり、times == c(0,20,40,60,120,180,240,360))。

この例では、「a」、「b」、および「s」の値に 59、140、および 1e-4 が必要です。これは、これらの「ex」の値 (DF) が「平均」の値 (DF2) に最も適合するためです。 .

「ex」(DF) が「平均」(DF2) に最も適合する値の「a」、「b」、および「s」の値が必要です

「a」、「b」、および「s」値の 1 つの可能な組み合わせが必要なので、線形最小二乗適合モデルが最適です。一度に 8 つの値を比較します。ここで、'times' == 0 - 360 です。個々の時点で最適に機能する 'a'、'b'、および 's' の値は必要ありません。8 つのすべての 'ex' (DF) が 8 つのすべての 'mean' 値 (DF2) に最もよく適合する 'a'、'b'、および 's' の値が必要です。

線形最小二乗フィッティングを使用したことはありませんが、私がやろうとしていることは可能だと思います。

      lm(DF2$mean ~ DF$ex,....) # i'm not sure if I should combine the two 
      # data frames first then use that as my data argument, then 
      # where I would include 'times' as the point of comparison, 
      # if that would be used in subset?   
4

1 に答える 1

1

線形モデルはここで必要なものではないようです。線形モデルは、最良の場合a/b/s、単一の最適な組み合わせではなく、さまざまな構成の線形結合を提供します。したがって、その名前の線形という用語。

の値がのtimesDFと一致することがある程度保証されていると思います。最初のステップの1つは、組み合わせごとに1つの行のみがあり、さまざまな値が行列の列として格納されるデータフレームに変換することです。次に、各行について、値から値を減算し、それらの差を2乗し、それらを合計して、行の単一の2乗誤差を計算します。次に、最小値の行を選択するだけです。timesDF2DFa/b/sexexDF2$mean

上記の解決策はかなりあいまいです。これを実際に実装する方法は無数にあります。私のソリューションをコピーする代わりに、自分で最もよく理解できる方法でそれらを作成する方がよい場合があります。個々のステップを達成する方法のヒント:

  • matrix(DF$ex, byrow=TRUE, ncol=8)行列を計算できます
  • DF[seq(from=1, to=nrow(DF), by=8),2:4]a/b/s各行列行に対応する値を提供します
  • cbindこれら2つを組み合わせるために使用することができます
  • matrix(DF2$mean, byrow=TRUE, ncol=8, nrow=nrow(DF)/8)それらの平均を単純に減算できる行列に変換します
  • **2行列のすべてのコンポーネントを二乗します
  • rowSums行列の行の要素を追加します
  • which.min最小値のインデックスを返します

すべてを1つの可能な方法でまとめ、中間変数を使用せずにすべてを1つの式にまとめます(最も読みやすいソリューションではありません)。

DF[seq(from=1, to=nrow(DF), by=8),2:4][which.min(
  rowSums((matrix(DF$ex, byrow=TRUE, ncol=8) -
           matrix(DF2$mean, byrow=TRUE, ncol=8, nrow=nrow(DF)/8)
          )**2
         )
),]

行列をデータフレームの一部として格納しない場合は、これらの引数を回避し、行列とベクトルの減算ですべてのbyrow=TRUEに対してベクトルが繰り返されるという事実を活用するために、行列を転置することをお勧めします。

DF[seq(from=1, to=nrow(DF), by=8),2:4][which.min(
  colSums((matrix(DF$ex, nrow=8) - DF2$mean)**2)),]
于 2012-09-04T21:27:41.847 に答える