【问题标题】:Matrix dropping the column names inconsistently in R矩阵在 R 中不一致地删除列名
【发布时间】:2021-01-16 15:07:36
【问题描述】:

我有一个名为foo 的小函数。当我使用m0 运行它时,它会正确显示列名。但是当我将它与m1 一起使用时,foo 会省略所有列名。

有解决办法吗?

library(lme4)
library(Matrix)

sng <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/sng.csv')
m0 <- lmer(y ~ A * B * C + (A * B * C  | group), data = sng)
m1 <- lmer(y ~ A * B * C + (A * B * C  || group), data = sng)

foo <- function(fit){
vc <- VarCorr(fit)
as.matrix(Matrix::bdiag(vc))
}
# EXAMPLES OF USE:
foo(m0)   # SHOWS COLUMNAMES FINE :-)
foo(m1)   # OMITS COLUMNNAMES ALL :-(

【问题讨论】:

    标签: r function dataframe matrix


    【解决方案1】:

    试试这个方法。看起来输出矩阵和VarCorr() 中的列表长度存在问题。代码如下:

    library(lme4)
    library(Matrix)
    #Data and models
    sng <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/sng.csv')
    m0 <- lmer(y ~ A * B * C + (A * B * C  | group), data = sng)
    m1 <- lmer(y ~ A * B * C + (A * B * C  || group), data = sng)
    #Function
    foo <- function(fit){
      vc <- VarCorr(fit)
      if(length(vc)==1)
      {
        y <- as.matrix(Matrix::bdiag(vc))
      } else
      {
        z <- do.call(rbind,vc)
        y <- as.matrix(Matrix::bdiag(vc))
        dimnames(y)[[1]] <- rownames(z)
        dimnames(y)[[2]] <- rownames(z)
      }
      return(y)
    }
    #Apply
    foo(m0)
    foo(m1)
    

    输出:

    foo(m0)
                   (Intercept)             A             B              C            A:B
    (Intercept)  3.55516422891  0.2559261707 -0.0472493899  0.00321219209 -0.02924403667
    A            0.25592617067  4.0133838788  0.0772138992 -0.03546219301 -0.22207717925
    B           -0.04724938991  0.0772138992  6.4063596371 -1.16254872282 -0.42778740468
    C            0.00321219209 -0.0354621930 -1.1625487228  4.78167840574 -0.05459620260
    A:B         -0.02924403667 -0.2220771793 -0.4277874047 -0.05459620260  0.04574366496
    A:C         -0.03399653992 -0.2008053942  0.3219439970 -0.42927661072 -0.00100945652
    B:C         -0.02404787917  0.0212759619 -0.1454033407 -0.43345150872  0.02116923485
    A:B:C        0.00586240974  0.0206112404  0.0140531649  0.04266309961 -0.00336982403
                           A:C            B:C           A:B:C
    (Intercept) -0.03399653992 -0.02404787917  0.005862409744
    A           -0.20080539424  0.02127596189  0.020611240433
    B            0.32194399704 -0.14540334071  0.014053164881
    C           -0.42927661072 -0.43345150872  0.042663099613
    A:B         -0.00100945652  0.02116923485 -0.003369824029
    A:C          0.05859594675  0.02996839148 -0.004072087992
    B:C          0.02996839148  0.05038262309 -0.004808881907
    A:B:C       -0.00407208799 -0.00480888191  0.000590970743
    
    foo(m1)
                (Intercept)           A           B         C A:B            A:C          B:C A:B:C
    (Intercept)  3.29966179 0.000000000 0.000000000 0.0000000   0 0.00000000e+00 0.0000000000     0
    A            0.00000000 0.914972854 0.000000000 0.0000000   0 0.00000000e+00 0.0000000000     0
    B            0.00000000 0.000000000 0.467647434 0.0000000   0 0.00000000e+00 0.0000000000     0
    C            0.00000000 0.000000000 0.000000000 1.1369602   0 0.00000000e+00 0.0000000000     0
    A:B          0.00000000 0.000000000 0.000000000 0.0000000   0 0.00000000e+00 0.0000000000     0
    A:C          0.00000000 0.000000000 0.000000000 0.0000000   0 6.72771167e-08 0.0000000000     0
    B:C          0.00000000 0.000000000 0.000000000 0.0000000   0 0.00000000e+00 0.0013880372     0
    A:B:C        0.00000000 0.000000000 0.000000000 0.0000000   0 0.00000000e+00 0.0000000000     0
    

    【讨论】:

      【解决方案2】:

      构造matrix后,我们检查dimnames是否为NULL。在这种情况下,从“VarCorr”对象中获取dimnamesattributes,并将它们作为dimnames分配给输出matrix

      foo <- function(fit){
           vc <- VarCorr(fit)
           out <- as.matrix(Matrix::bdiag(vc))
           if(is.null(unlist(dimnames(out)))) {
             nm <- unlist(lapply(vc, function(x) attributes(x)$dimnames[1]))
            dimnames(out) <- list(nm, nm)
           }
           out
           }
           
      

      -测试

      foo(m0)
                    (Intercept)           A           B            C          A:B          A:C          B:C         A:B:C
      (Intercept)  3.7562550486  0.02806147 -0.07385379 -0.188350388  0.072254892 -0.045056715 -0.023888893  0.0003069446
      A            0.0280614731  3.99805818 -0.04527522 -0.091514845 -0.230125332 -0.198148495  0.032987776  0.0205313838
      B           -0.0738537902 -0.04527522  6.58615173 -1.351344388 -0.457616613  0.340081875 -0.154002255  0.0156069012
      C           -0.1883503881 -0.09151484 -1.35134439  4.748865101 -0.004621977 -0.396069722 -0.396633305  0.0362619475
      A:B          0.0722548916 -0.23012533 -0.45761661 -0.004621977  0.049207775 -0.005718505  0.017880341 -0.0031794465
      A:C         -0.0450567147 -0.19814850  0.34008188 -0.396069722 -0.005718505  0.053356862  0.023347554 -0.0032476293
      B:C         -0.0238888932  0.03298778 -0.15400225 -0.396633305  0.017880341  0.023347554  0.045604619 -0.0040810919
      A:B:C        0.0003069446  0.02053138  0.01560690  0.036261947 -0.003179446 -0.003247629 -0.004081092  0.0005059711
      foo(m1)
      
      (Intercept)         A         B        C          A:B         A:C         B:C A:B:C
      (Intercept)     2.26533 0.0000000 0.0000000 0.000000 0.000000e+00 0.00000e+00 0.000000000     0
      A               0.00000 0.8446554 0.0000000 0.000000 0.000000e+00 0.00000e+00 0.000000000     0
      B               0.00000 0.0000000 0.4905843 0.000000 0.000000e+00 0.00000e+00 0.000000000     0
      C               0.00000 0.0000000 0.0000000 1.169259 0.000000e+00 0.00000e+00 0.000000000     0
      A:B             0.00000 0.0000000 0.0000000 0.000000 4.816447e-08 0.00000e+00 0.000000000     0
      A:C             0.00000 0.0000000 0.0000000 0.000000 0.000000e+00 7.71255e-09 0.000000000     0
      B:C             0.00000 0.0000000 0.0000000 0.000000 0.000000e+00 0.00000e+00 0.001425746     0
      A:B:C           0.00000 0.0000000 0.0000000 0.000000 0.000000e+00 0.00000e+00 0.000000000     0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多