2

私は4つのテーブルを持っています。それぞれに4行4列があります。以下は4つの表です。

1番目のテーブルの場合、

t1 <- array(1:20, dim=c(4,4))


    [,1] [,2] [,3] [,4] 
[1,]    1    5    9   13 
[2,]    2    6   10   14 
[3,]    3    7   11   15 
[4,]    4    8   12   16

2番目のテーブルの場合、

t2 <- array(6:25, dim=c(4,4))

     [,1] [,2] [,3] [,4]
[1,]    6   10   14   18
[2,]    7   11   15   19
[3,]    8   12   16   20
[4,]    9   13   17   21

3番目のテーブルの場合、

t3 <- array(11:30, dim=c(4,4))

     [,1] [,2] [,3] [,4]
[1,]   11   15   19   23
[2,]   12   16   20   24
[3,]   13   17   21   25
[4,]   14   18   22   26

4番目のテーブルの場合、

t4 <- array(21:30, dim=c(4,4))

     [,1] [,2] [,3] [,4]
[1,]   21   25   29   23
[2,]   22   26   30   24
[3,]   23   27   21   25
[4,]   24   28   22   26

テーブルごとに、y値の固定セットを取得しました。

t1 = 0.1 
t2 = 3
t4 = 0.5
t6 = 7

言い換えると:

y <- c( 0.1, 3, 0.75, 7)

次に、4つのテーブルの各セルからx値を抽出します。つまり、[1,1]セルの場合、抽出されるx値は(0.1、3、0.5、7)である必要があります。テーブルの最後、つまり[4,4]セルまで、この手順を1つずつ繰り返します。したがって、次のように合計16セットのx値を取得しました。

cell   x-values
[1,1]  (1,6,11,21) 
[1,2]  (5,10,15,25) 
…..
[4,4]  (16, 21,26,26)

次に、各yxペアの線形回帰のR2を計算しようとします。つまり、次のように合計16個のR2値を取得したいと思います。

For [1,1] cell, linear regression between (0.1, 3, 0.5, 7) and (1,6,11,21) = 0.6853
For [1,2] cell, linear regression between (0.1, 3, 0.5, 7) and (5,10,15,25) = 0.6853 
…..
For [4,4] cell, linear regression between (0.1, 3, 0.5, 7) and (16, 21,26,26) = 0.2719 

最後に、次の2つの列を持つテーブルを取得したいと思います

cell   R2 
[1,1] 0.6853
[1,2] 0.6853
….
[4,4] 0.2719

xおよびy系列のデータに対して線形回帰を行うには、次のコマンドを使用できることを学びました。

Rcoefficient <- summary(lm(y ~ x, data=faithful))$r.squared

ただし、4つのテーブルからx値の各セットを読み込むのに問題があります。reshapeを使おうとしましたが、それでもうまくいきません。Stackoverflowの専門家は、Rでそれを行うための効率的な方法を提案するのに役立ちます。私の実際のテーブルは非常に大きく、1000を超える列と行があるためです。

どうもありがとう。

4

2 に答える 2

7

配列を4x4 x 4の配列に連結することにより、その場で配列を操作します[*]。

t1 <- array(1:20, dim=c(4,4))
t2 <- array(6:25, dim=c(4,4))
t3 <- array(11:30, dim=c(4,4))
t4 <- array(21:30, dim=c(4,4))

tt <- array(c(t1,t2,t3,t4), dim = c(4,4,4))
## now you can remove the original arrays

これは次のようになります。

> tt
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16

, , 2

     [,1] [,2] [,3] [,4]
[1,]    6   10   14   18
[2,]    7   11   15   19
[3,]    8   12   16   20
[4,]    9   13   17   21

, , 3

     [,1] [,2] [,3] [,4]
[1,]   11   15   19   23
[2,]   12   16   20   24
[3,]   13   17   21   25
[4,]   14   18   22   26

, , 4

     [,1] [,2] [,3] [,4]
[1,]   21   25   29   23
[2,]   22   26   30   24
[3,]   23   27   21   25
[4,]   24   28   22   26

次に、を使用aperm()して配列の次元を再配置し、要求したインデックスが正しい順序になるようにします。最後のステップとして、この配列から行列を作成します。

X <- matrix(aperm(tt, c(3,1,2)), ncol = 4, byrow = TRUE)

aperm(tt, c(3,1,2))ステップは生成します

> aperm(tt, c(3,1,2))
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    6    7    8    9
[3,]   11   12   13   14
[4,]   21   22   23   24

, , 2

     [,1] [,2] [,3] [,4]
[1,]    5    6    7    8
[2,]   10   11   12   13
[3,]   15   16   17   18
[4,]   25   26   27   28

, , 3

     [,1] [,2] [,3] [,4]
[1,]    9   10   11   12
[2,]   14   15   16   17
[3,]   19   20   21   22
[4,]   29   30   21   22

, , 4

     [,1] [,2] [,3] [,4]
[1,]   13   14   15   16
[2,]   18   19   20   21
[3,]   23   24   25   26
[4,]   23   24   25   26

ここで、必要なインデックスは列にあります。これは、行列をRとして作成するときに利用し、並べ替えられた配列を、並べ替えられた配列の列から満たされたベクトルとして扱います。X結果は

> X
      [,1] [,2] [,3] [,4]
 [1,]    1    6   11   21
 [2,]    2    7   12   22
 [3,]    3    8   13   23
 [4,]    4    9   14   24
 [5,]    5   10   15   25
 [6,]    6   11   16   26
 [7,]    7   12   17   27
 [8,]    8   13   18   28
 [9,]    9   14   19   29
[10,]   10   15   20   30
[11,]   11   16   21   21
[12,]   12   17   22   22
[13,]   13   18   23   23
[14,]   14   19   24   24
[15,]   15   20   25   25
[16,]   16   21   26   26

次に、@ Januaryの回答に従って続行し、回帰を適合させることができます(ただしy、のスコープ規則lm()は非標準であり、防御的であるため、明示的に渡します)。

y <- c( 0.1, 3, 0.75, 7)
r2 <- apply(X, 1, function(x, y) summary(lm(y ~ x))$r.squared, y = y)

これにより、次のようになります。

> head(r2)
[1] 0.7160542 0.7160542 0.7160542 0.7160542 0.7160542 0.7160542

テキストとコードに矛盾があることに注意してください。応答は(0.1、3、0.5、7)であると述べていますが、として定義yc( 0.1, 3, 0.75, 7)ます。私が示す結果は後者を使用していますが、あなたの結果は前者を使用しているため、違いがあります。

[*]コンテキストについて詳しく知らなくても、何百万もの線形モデルに適合させたいかどうかはわかりません...

于 2012-10-16T08:00:49.100 に答える
-2

まず、データを再フォーマットしましょう。

編集:このコードは最適ではありません。他の回答のGavinsソリューションを参照してください。

t <- NULL
for( row in 1:nrow( t1 ) ) {
  for( col in 1:ncol( t1 ) ) {
    t <- rbind( t, c( t1[ row, col ], t2[ row, col ], t3[ row, col ], t4[ row, col ] ) )
   }
 }

これにより、4つの列(テーブルごとに1つ)とnrow * ncol行(1つのテーブルにセルがあるのと同じ数の行)を持つ行列が生成されます。で確認してくださいdim( t )。回帰の実行が簡単になりました。

apply( t, 1, function( x ) { summary( lm( y ~ x ) )$r.squared )
于 2012-10-16T06:23:01.263 に答える