【问题标题】:How to find correlation coefficients in a loop?如何在循环中找到相关系数?
【发布时间】:2018-07-20 07:25:46
【问题描述】:

我有一个这样的数据集:

Account_tenure_years = c(982,983,984,985,986,987,988)
N=c(12328,18990,21255,27996,32014,15487,4347)
Y=c(76,64,61,76,94,55,11)
df_table_account_tenure_vs_PPC = data.frame(Account_tenure_years,N,Y)

The dataset looks like this:

Account_tenure_years   N     Y
982                  12328  76
983                  18990  64
984                  21255  61
985                  27996  76
986                  32014  94
987                  15487  55
988                   4347  11

我想做的是这样的:

我想在Account_tenure_years 中的任意两个@ 之间找到correlation,例如982,983 并找到correlation coefficientNY columns 即我想找到下面的correlation coefficient

  Account_tenure_years   N     Y
  982                  12328  76
  983                  18990  64

现在我想重复这个 8C2 次,即 28 次。采取不同的行并在每种情况下找到correlation coefficient。 即在下一次迭代中我想要:

 Account_tenure_years   N     Y
  983                  18990  64
  984                  21255  61 

然后找到它的correlation coefficient。现在,在我收到所有这 28 个correlation coefficients 之后,我将average 拿出来并为整个数据集找到一个mean correlation coefficient

我如何在 R 中做到这一点?

好吧,如果我找出列之间的相关系数,让我们直截了当

Account_tenure_years column, N 

如果我尝试找出列之间的相关系数

Account_tenure_years column, Y

如果我在每种情况下都发现负相关系数,我们能从中推断出什么吗?

【问题讨论】:

  • 您需要每一行的correlation coefficient 计数,对吗?我不明白它怎么可能是 28 次?
  • @Saurabh Chauhan 让它更简单。假设您先计算 Account_tenure_years 和 N 之间的相关系数,然后计算 Account_tenure_years 和 Y 之间的相关系数,然后找出每种情况下的相关性。如果,假设你在这两种情况下都得到负相关,从统计学上你会推断出什么?或者可以推断出什么?
  • 为每个案例计算correlation coefficient 是没有意义的,因为它通常是针对整个数据集计算的。
  • 不不,你看这里的主要重点是找到数据集的相关系数,但它是一个 8 $\times$ 3 的数据集,你必须找出第一个和第二个之间的相关性列,然后在第一列和第三列之间。
  • 你能检查我的答案吗?我为你做了同样的事情。

标签: r


【解决方案1】:

这不是为每种情况计算correlation coefficient 的理想方法。应该针对整个数据集进行计算:

Account_tenure_years = c(982,983,984,985,986,987,988)
N=c(12328,18990,21255,27996,32014,15487,4347)
Y=c(76,64,61,76,94,55,11)
df = data.frame(Account_tenure_years,N,Y)

cor(df$Account_tenure_years,df$N)
cor(df$Account_tenure_years,df$Y)

输出如下图:

> cor(df$Account_tenure_years,df$N)
[1] -0.1662244
> cor(df$Account_tenure_years,df$Y)
[1] -0.5332263

您可以推断数据是负相关的。这意味着增加Account_tenure_years 的值将减少NY 的值,反之亦然。

请随时纠正我!

【讨论】:

    【解决方案2】:

    转置数据应该更容易,而且最好的部分是你甚至不需要编写循环。

    试试这个:

    dt <- data.table::fread("
    Account_tenure_years   N     Y
    982                  12328  76
    983                  18990  64
    984                  21255  61
    985                  27996  76
    986                  32014  94
    987                  15487  55
    988                   4347  11
    ")
    
    
    dt.t <- as.data.frame(t(dt[, 2:3]))
    
    colnames(dt.t) = dt$Account_tenure_years
    # transpose
    dt.t
    #>     982   983   984   985   986   987  988
    #> N 12328 18990 21255 27996 32014 15487 4347
    #> Y    76    64    61    76    94    55   11
    
    # calculate correlation matrix, read more help(cor)
    cor(dt.t)
    #>     982 983 984 985 986 987 988
    #> 982   1   1   1   1   1   1   1
    #> 983   1   1   1   1   1   1   1
    #> 984   1   1   1   1   1   1   1
    #> 985   1   1   1   1   1   1   1
    #> 986   1   1   1   1   1   1   1
    #> 987   1   1   1   1   1   1   1
    #> 988   1   1   1   1   1   1   1
    

    reprex package (v0.2.0.9000) 于 2018 年 7 月 20 日创建。

    【讨论】:

      【解决方案3】:

      我不明白你想如何计算两个变量之间的相关系数,每个变量只有一个观察值。因此,我假设您的行数比此处提供的多。

      首先定义所有组合:

      combinations <- combn(df_table_account_tenure_vs_PPC$Account_tenure_years, 2)
      

      对于每个组合,您要提取相应的行并计算每个变量的相关系数:

      coefficients <- apply(combinations, 2, function(x, df_table_account_tenure_vs_PPC){
          coef <- sapply(c("N", "Y"), function(v, x, df_table_account_tenure_vs_PPC){
              c <- cor(df_table_account_tenure_vs_PPC[df_table_account_tenure_vs_PPC == x[1], v], df_table_account_tenure_vs_PPC[df_table_account_tenure_vs_PPC == x[2], v])
              return(c)},
          x, df_table_account_tenure_vs_PPC)
          return(c(x, coef))},
      df_table_account_tenure_vs_PPC)
      

      然后,您可以将结果汇总到 data.frame 中:

      df <- as.data.frame(t(coefficients))
      colnames(df) <- c("Year1", "Year2", "N_cor", "Y_cor")
      

      这应该可行。如果您有任何问题,请告诉我。 同样,如果您想要一个有意义的相关系数,请确保在每个条件下都有多个观察值。

      【讨论】:

      • 你能告诉我参数“组合”代表什么 - 它给出了一个错误。请进行编辑以显示它。顺便说一句,谢谢你的回答。
      • 抱歉,我的答案格式不正确,您现在应该可以看得更清楚了。
      • df
      • 我已经再次更新了我的答案来解决这个问题(我从来没有第一次考虑过应用输出)。您应该有一个充满 NA 的 data.frame,因为您每年只有一次观察,每年有更多观察,它应该可以工作。
      • 我刚刚在您的问题下注意到您的 cmets。请澄清问题,因为您在评论中提出的问题似乎不是您在问题中提出的问题。因此,我的回答可能无法解决您想要解决的问题,因为我可能没有很好地理解它。你想要年份之间的相关系数(我第一次理解),还是变量之间的相关系数?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2021-07-13
      • 2018-04-18
      • 1970-01-01
      • 2022-07-21
      • 2013-04-04
      • 2020-08-13
      相关资源
      最近更新 更多