【问题标题】:Loop for Correlation in RR中的相关循环
【发布时间】:2020-08-31 21:28:46
【问题描述】:

我试图找到一种在 r 中执行嵌套 for 循环的方法,以获得所有可能的相关组合:

cor(y, column1* column2), cor(y, column1* column3), cor(y, column1* column4)
等等

这是我迄今为止尝试过的:

for(i in 1:length(dataframe))
{
for(j in 1:length(dataframe))
{
joint_correlation(i,j)=cor(y ~ dataframe(i) * dataframe(j));
}
}

我的数据框有 115 列,如小样本所示:

FG_pct FGA FT FT_pct FTA GP GS GmSc  MP    ORB

0.625   8   0  0.00   0  1  0   6.6  28.4   2   
0.500   4   0  0.00   1  2  0   2.1  17.5   0   
0.000   1   0  0.00   0  3  0   1.2  6.6    1   
0.500   6   0  0.00   0  4  0   3.6  13.7   1   
0.500   2   0  0.00   0  5  0   0.9  7.4    1   

我想找到cor(MP, column1* column2) 的相关性,以便为column1 和column2 切换出每个可能的组合。这样,我就不必分别做每一个。如果可能,我想将每个相关组合cor(MP, column1* column2)cor(MP, column1* column3)cor(MP, column2* column4) 等的输出保存在单独的列中。

这是我想要的一个例子: cor(MP, FG_pct*FT_pct)

【问题讨论】:

  • 等等,什么相关?语法 cor(y ~ var1*var2) 在 R 中无效(dataframe(i) 也不是)。你想做什么?例如,如果你只是想要相关矩阵,你可以做cor(dataframe)
  • 我想做 cor(MP ~ column1*column2), cor(MP ~ column1*column3), cor(MP ~ column1*column4), cor(MP ~ column2*column3), cor( MP ~ column2*column4),以此类推。我想获得 column1*column2 的每一个组合,因为我的数据框中有 115 列。
  • cor(MP ~ column1*column2) 应该是什么意思?如前所述,这不是有效的语法。
  • 在 r 中,尝试运行 cor(MP ~ FGA*ORB)。你会得到一个输出。我想要 MP 与 column1*column2 的相关性。我希望输入每一列。你提供的不是循环。
  • 呃,不。它会产生错误。您是否加载了隐藏默认 cor 的包?

标签: r loops nested-loops correlation


【解决方案1】:

假设您希望每一列的相关性乘以其余两列的组合。

我们可以使用combn(names(dat), 2)找到相应组合的名称,我们将其放入lapply中。

combs <- do.call(cbind.data.frame,
                 lapply("MP", rbind, combn(names(dat)[names(dat) != "MP"], 2)))
combs
#        1      2   3
# 1     MP     MP  MP
# 2 FG_pct FG_pct FGA
# 3    FGA     FT  FT

在另一个lapply 中,我们对名称组合上的数据进行子集化,并使用公式cor(x1 ~ x2 * x3) 计算cor。同时,我们将名称 pasted 作为公式存储在 attribute 中,以便稍后记住我们在每次迭代中计算的内容。

res.l <- lapply(combs, function(x) {
  `attr<-`(cor(dat[,x[1]], dat[,x[2]]*dat[,x[3]]),
           "what", {
             paste0(x[1], ", ", paste(x[2], "*", x[3]))})
})

最后我们根据属性unlistsetNames

res <- setNames(unlist(res.l), sapply(res.l, attr, "what"))
res

结果

# MP, FG_pct * FGA  MP, FG_pct * FT     MP, FGA * FT 
#        0.2121374        0.2829003        0.4737892 

检查:

(注意,你可以直接将名字,例如MP,FG_pct * FGA放入cor函数中。)

with(dat, cor(MP, FG_pct * FGA))
# [1] 0.2121374
with(dat, cor(MP, FG_pct * FT))
# [1] 0.2829003
with(dat, cor(MP, FGA * FT))
# [1] 0.4737892

要排序,请使用例如sort(res)rev(sort(res))

玩具数据:

set.seed(42)
dat <- as.data.frame(`colnames<-`(MASS::mvrnorm(n=1e4, 
                          mu=c(0.425, 4.2, 0.2, 3), 
                          Sigma=matrix(c(1, .3, .7, 0,
                                         .3, 1, .5, 0,
                                         .7, .5, 1, 0,
                                         0, 0, 0, 1), nrow=4), 
                          empirical=T), c("FG_pct", "MP", "FGA", "FT")))

【讨论】:

    【解决方案2】:

    编辑:Jean-Claude Arbaut 给出了更好的答案,正如对此答案的评论。使用 cor(df)。

    这是我拙劣的答案:使用库 corrgram(主要是一个可视化工具),我们可以轻松获得数据集中的所有相关组合。示例:

    library(corrgram)
    
    #Example data
    
    df <- data.frame(x = rnorm(50, 5, 5),
                   y = rnorm(50, 2, 5))
    
    df$z <- df$x / df$y
    df$abc <- df$x * df$y * df$z
    
    #panel arguments are necessary if you want to visualize correlations
    corr <- corrgram(df,
             order = F, 
             lower.panel = panel.cor,
             upper.panel = panel.pts,
             text.panel = panel.txt,
             diag.panel = panel.minmax,
             main = "Correlation")
    
    #call corr gives
    corr
    
                 x          y         z        abc
    x   1.00000000 0.07064179 0.1402051 0.89166002
    y   0.07064179 1.00000000 0.2495239 0.08024278
    z   0.14020508 0.24952388 1.0000000 0.14649093
    abc 0.89166002 0.08024278 0.1464909 1.00000000
    

    绝对有更好的方法可以使用函数而不使用包来执行此操作,但它还处于早期阶段,如果您迫切希望获得结果,这可能会很好。

    p.s 使用 corrgram() 函数而不分配它会给你一个很好的相关性可视化。

    【讨论】:

    • 但是如果你想要一个数据框的相关矩阵,在base R中有cor(df)。你不需要一个包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多