获得线性回归系数矩阵的更好方法

Mar*_*B42 1 loops r function matrix

我有一个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"))
Run Code Online (Sandbox Code Playgroud)

它的数据看起来像这样

                      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
Run Code Online (Sandbox Code Playgroud)

并且我可以通过使用获得每个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 )
}
Run Code Online (Sandbox Code Playgroud)

我的函数的输出看起来像这样

          val1      val2      val3
val1        NA 0.3015123 0.6071429
val2 0.8122685        NA 0.7978208
val3 0.6384838 0.3114367        NA
Run Code Online (Sandbox Code Playgroud)

Gre*_*now 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
Run Code Online (Sandbox Code Playgroud)

  • 那太棒了! (2认同)