【问题标题】:R Compare all columns in a matrix against each in loopR将矩阵中的所有列与循环中的每个列进行比较
【发布时间】:2013-06-29 04:13:45
【问题描述】:

我有一个变量矩阵,我正在尝试运行一个循环来比较回归中所有变量之间的差异,以便生成一个矩阵并用差异填充。下面是一些模拟代码来解决这个问题。我想生成一个比较 x_1、x_2 和 x_3 的矩阵,以生成一个关于对角线对称的 3x3 矩阵,这些矩阵都应该为零。

y <- sample(seq(1:4), 100, replace = TRUE)
x_1 <- sample(seq(1:2), 100, replace = TRUE)
x_2 <- sample(seq(1:4), 100, replace = TRUE)
x_3 <- sample(seq(1:4), 100, replace = TRUE)

frame <- cbind(x_1, x_2, x_3)
dif <- matrix(NA, ncol = 3, nrow = 3)

for(i in 1:3){
    model_1 <- lm(y ~ frame[,i])
    model_2 <- lm(y ~ frame[,i])
    dif[i]<- (model_2$coef[2] - model_1$coef[2])
}

我很困惑如何索引循环并参考 x 的矩阵以生成一个 3x3 的结果表 - 任何帮助将不胜感激。

【问题讨论】:

    标签: r loops matrix indexing


    【解决方案1】:

    试试这个:

    model <- list()
    for(i in 1:3) { 
        model[[i]] <- lm(y~frame[,i])
    }
    
    dif<-sapply( 1:3, function(i) { sapply(1:3, function(j) { model[[i]]$coef[2] - model[[j]]$coef[2] } ) } )
    

    矩阵将是反对称的,即dif[i,j] = -dif[j,i]

    【讨论】:

    • 当然。我收到了[,1] [,2] [,3] frame[, i] 0.0000000 0.45301438 0.48499630 frame[, i] -0.4530144 0.00000000 0.03198192 frame[, i] -0.4849963 -0.03198192 0.00000000 (抱歉,不能换行)
    【解决方案2】:

    我可能不明白你在追求什么,但这里有一个使用多个向量的outer 版本的破解。

    library(qdap)
    FUN <- function(x1, x2, y)lm(y ~ x1)$coef[2] - lm(y ~ x2)$coef[2]
    v_outer(list(x_1, x_2, x_3), FUN, y = y)
    
    ##       X1     X2     X3
    ## X1 0.000 -0.311 -0.079
    ## X2 0.311  0.000  0.232
    ## X3 0.079 -0.232  0.000
    

    【讨论】:

    • outer 不接受向量吗?
    • 没有。它需要一个向量。这将多个向量作为数据框或向量列表。有关更多信息,请参阅?v.outer。这就是为什么您需要在下面的答案中首先进行 lm 评估。
    • 我说错了它最多需要 2 个向量。好吧,这样说吧,假设你有mtcarsouter,并想使用outer 做一个相关矩阵。你能做这个吗?不容易。
    • 是的,但这是一个熟悉的场景。
    【解决方案3】:

    我更喜欢evalparse 路线,喜欢@Tyler 我喜欢base:::outer...

    #  Make your data into a data.frame
    df <- data.frame( y , x_1 , x_2 , x_3 )
    
    #  The variables we want to test
    x <- c("x_1","x_2","x_3") 
    
    #  Make the text for each model to parse and evalaute
    mods <- paste0( "lm( y ~ " , x , " , data = df )" )
    
    #  Evaluate the lm for each variable
    coefs <- unlist( lapply( mods , function(x) eval(parse(text=x))$coef[2] ) )
    #       x_1         x_2         x_3 
    # -0.52140856  0.04662379  0.08694344 
    
    #  Combine the results with outer
    outer( coefs , coefs ,  "-")
    #         x_1         x_2         x_3
    # x_1 0.0000000 -0.56803236 -0.60835201
    # x_2 0.5680324  0.00000000 -0.04031965
    # x_3 0.6083520  0.04031965  0.00000000
    

    【讨论】:

      【解决方案4】:
       vcoef <- numeric(3)
       for(i in 1:3) { 
           vcoef[i] <- coef( lm(y~frame[,i]))[2]
                     }
      
      outer(vcoef, vcoef, "-")
      #----------
                [,1]        [,2]        [,3]
      [1,] 0.0000000 -0.15208933 -0.17302592
      [2,] 0.1520893  0.00000000 -0.02093659
      [3,] 0.1730259  0.02093659  0.00000000
      

      如果您不想要冗余信息,您可以使用 combn 获得所有成对差异:

      > combcos  <- combn(vcoef,2)
      > combcos[1, ] -combcos[2, ]
      [1] -0.15208933 -0.17302592 -0.02093659
      

      【讨论】:

        【解决方案5】:

        如果我理解您尝试通过比较模型的系数来比较模型。一种想法是使用meifly 包。

        首先我生成你的数据:

        set.seed(1)
        frame <- matrix(sample(1:4,3*100,rep=TRUE),ncol=3)
        y <- sample(seq(1:4), 100, replace = TRUE)
        

        然后我使用fitbest,它使用leaps 包快速找到给定数量变量的n 个最佳模型。

        library(meifly)
        library(reshape2)
        library(ggplot2)
        ## we look only on models with one variable
        res <- fitbest(y~.,as.data.frame(frame),nvmax=1)
        ## get coefficients
        res.coef <- coef(res)
        ## remove zero models 
        res.coef[res.coef == 0] <- NA
        res.coef <- na.omit(res.coef)
        

        现在,对于每个模型,我们都有一个系数摘要。对于每个变量,我们都有以下信息:

        1. 原始系数
        2. t值和绝对t值
        3. 标准化系数。

        而 res.coef 看起来像这样:

        res.coef
             model observ         raw          t      abst         std
        m1v1     1     V1 -0.12884211 -1.2438295 1.2438295 -0.14110975
        m2v2     2     V3  0.09258638  0.8922776 0.8922776  0.10161095
        m3v3     3     V2  0.01534989  0.1420060 0.1420060  0.01623527
        

        比较模型的一种方法是绘制所有与变量的散点图

        colnames(res.coef)[colnames(res.coef)== "variable"] <- "observ"
        dat <- melt(res.coef)
        ggplot(dat) +
           geom_point(aes(observ,value,color=variable),size=5) +
           theme_bw()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-24
          • 1970-01-01
          • 2017-08-05
          • 1970-01-01
          • 1970-01-01
          • 2017-03-06
          相关资源
          最近更新 更多