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")之间的相关性,我想要一个类似的矩阵,但我想要线性回归系数而不是三个 val 之间的相关性。我创建了一个完全符合我要求的函数,但 R 对我来说是新的,我觉得我是以非常 C/C++ 的方式完成的。我希望也许有人可以帮助我创建一个更像 R 的解决方案(也许使用其中一种 apply 方法,或者甚至是指向可以帮助我理解如何进行此类操作的东西的链接)。

我创建的函数如下所示

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它将 amatrix作为其第一个参数,后跟一个 index = 1here(用于按行),然后它允许定义一个函数。请注意,索引也可以是 2,这意味着这些值将按列发送,这是我们不想要的。Index = 1 表示来自 idx 的值将作为 (1,1)、(2,1) 等传递。一次一个。我们用它来创建一个函数,它的参数 ix 每次都是 (1,1), (2,1) ... 并使用一个简单的 if-else 语句构造所有输出。然后将其塑造成您需要的矩阵形式。我希望这会有所帮助。

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 回答