1

xtsオブジェクトXがあります

dput(x)
structure(c(111.09, 110.95, 110.71, 110.79, 110.72, 110.83, 110.75, 
110.74, 110.85, 110.95, 110.98, 120.99, 121.27, 120.61, 120.55, 
120.76, 120.86, 120.82, 120.88, 121.1, 120.86, 120.76, 111.29, 
111.08, 110.95, 110.88, 111.05, 111.17, 111.17, 111.17, 111.2, 
111.19, 111.28), .Dim = c(11L, 3L), .Dimnames = list(NULL, c("val1", 
"val2", "val3")), index = structure(c(1356987540, 1357160340, 
1357246740, 1357333140, 1357592340, 1357678740, 1357765140, 1357851540, 
1357937940, 1358197140, 1358283540), tzone = "GMT", tclass = c("POSIXct", 
"POSIXt")), .indexCLASS = c("POSIXct", "POSIXt"), .indexTZ = "GMT", tclass = c("POSIXct", 
"POSIXt"), tzone = "GMT", class = c("xts", "zoo"))

そのデータは次のようになります

                      val1   val2   val3
2012-12-31 20:59:00 111.09 120.99 111.29
2013-01-02 20:59:00 110.95 121.27 111.08
2013-01-03 20:59:00 110.71 120.61 110.95
2013-01-04 20:59:00 110.79 120.55 110.88
2013-01-07 20:59:00 110.72 120.76 111.05
2013-01-08 20:59:00 110.83 120.86 111.17
2013-01-09 20:59:00 110.75 120.82 111.17
2013-01-10 20:59:00 110.74 120.88 111.17
2013-01-11 20:59:00 110.85 121.10 111.20
2013-01-14 20:59:00 110.95 120.86 111.19
2013-01-15 20:59:00 110.98 120.76 111.28

そして、を使用して各val(val1、val2、val3)間の相関を取得できます。cor(x, method="pearson")同様の行列が必要ですが、3つのval間の相関の代わりに、線形回帰係数が必要です。私は自分のやりたいことを正確に実行する関数を作成しましたが、Rは私にとって新しいものであり、非常にC /C++の方法で作成したように感じます。誰かが私がよりRに似たソリューションを作成するのを手伝ってくれることを願っています(多分applyメソッドの1つを使用するか、このような操作を行う方法を理解するのに役立つ何かへのリンクさえ使用します)。

私が作成した関数は次のようになります

getLmFromValues <- function( vals ) {

    #create an empty data.frame
    df <- data.frame( matrix(0, nrow = ncol(vals), ncol = ncol(vals) ) )

    colnames(df) <- colnames(vals)
    rownames(df) <- colnames(vals)

    for( outer in 1:ncol(vals) ) {

        for ( inner in 1:ncol(vals) ) {

            if ( inner == outer ) {
                df[outer,inner] <- NA #could also be 1
            }
            else {
                            #get linear model of vectors and store the slope coeficient
                df[outer, inner] <- coef( lm( vals[,outer] ~ vals[,inner] ) )[2]
            }
        }
    }

    return( df )
}

私の関数からの出力は次のようになります

          val1      val2      val3
val1        NA 0.3015123 0.6071429
val2 0.8122685        NA 0.7978208
val3 0.6384838 0.3114367        NA
4

2 に答える 2

7

単一の線形予測子を使用した回帰モデルの傾きは、$ \ hat \ beta = \ rho \ times \ frac {\ sigma_y} {\sigma_x}$です。したがって、標準偏差に基づいて、相関行列に対角行列を掛けることができます。

mysd <- sqrt( diag( var(mydata) ) )

diag( mysd ) %*% cor(mydata) %*% diag( 1/mysd )

          [,1]      [,2]      [,3]
[1,] 1.0000000 0.3015123 0.6071429
[2,] 0.8122685 1.0000000 0.7978208
[3,] 0.6384838 0.3114367 1.0000000
于 2013-01-24T21:14:24.700 に答える
3

このようなもの?まず、で可能なすべての組み合わせを作成しますexpand.grid。次に、それを最初の引数として使用applyし、その後にインデックス= here(行単位)を続けて、関数を定義できるようにします。インデックスは2にすることもできます。これは、値が列ごとに送信されることを意味しますが、ここでは必要ありません。Index = 1は、idxからの値が(1,1)、(2,1)などとして一度に1つずつ渡されることを意味します。そして、それを使用して、毎回(1,1)、(2,1)...になるパラメーターixを持つ関数を作成し、単純なif-elseステートメントを使用してすべての出力を作成します。次に、必要なマトリックス形式に成形します。私はこれが役立つと思います。matrix1

idx <- expand.grid(1:3, 1:3)
out <- apply(idx, 1, function(ix) {
    if (all(ix==ix[1])) {
        return(NA)
    } else {
        summary(lm(x[1:11, ix[1]] ~ x[1:11, ix[2]]))$coefficients[2,1]
    }
})

> out.m <- matrix(out, ncol=3)
> out.m

#           [,1]      [,2]      [,3]
# [1,]        NA 0.3015123 0.6071429
# [2,] 0.8122685        NA 0.7978208
# [3,] 0.6384838 0.3114367        NA
于 2013-01-24T21:09:03.937 に答える