如何在要重复 5000 次的 for 循环中找到相关系数?并保存统计

how to find correlation coefficient in a for loop that is to be repeated 5000 times? and save the statistic

对于 2 个独立的正态分布变量 x 和 y,使用 x = rnorm(50) 和 y = rnorm(50) 找到它们。计算相关性5000次,每次保存结果。计算绝对值大于 0.3 的相关性的可能性有多大? (默认 set.seed(42) 并绘制系数分布的直方图)

这是我目前尝试过的...

set.seed(42)

n <- 50 #length of random sequence
x_norm <- rnorm(n)
y_norm <- rnorm(n)

nrun <- 5000  
corr <- numeric(nrun) 

for (i in 1:nrun) {
corrxy <-  cor(x_norm,y_norm)
corr[i] <- sum(abs(corrxy > 0.3)) / n  #save statistic in the vector
    }

hist(corr)

预计我会在 [i] 中保存 5000 个不同的系数数,并且当使用 hist(0) 绘制时,这些系数应大致服从正态分布。但我不明白 for 循环是如何工作的以及如何合并大于 0.3 的系数值。

我想你快到了。您只需要在 for 循环内外移动一些代码。

您需要为循环的每个 运行 获取新数据(否则您将获得相同的相关性 5000 次)并且您需要在每次循环 运行 时保存相关性。这会产生一个包含 5000 个相关性的向量,您可以使用它来查看 for 循环外高于 .3 的相关性比例(除以 运行 的数量,而不是观察的数量)。

编辑:需要对绝对函数的括号进行最后一次更正。您想要找到 > .3 的绝对相关性,而不是 corrxy > .3.

的绝对值
set.seed(42)

n <- 50 #length of random sequence


nrun <- 5000  
corrxy <- numeric(nrun) # The correlation is the statistic you want to save

for (i in 1:nrun) {
x_norm <- rnorm(n) # Compute a new dataset for each run (otherwise you get the same correlation)
y_norm <- rnorm(n)
     corrxy[i] <-  cor(x_norm,y_norm) # Calculate the correlation

}
hist(corrxy)
sum(abs(corrxy) > 0.3) / nrun # look at the proportion of runs that have cor > .3

下面是 5000 个相关性的结果直方图。相关性高于 |.3| 的比例在这种情况下是 0.034。

这是另一种无需显式调用循环即可进行此类模拟的方法:

首先定义你的模拟:

my_sim <- function(n) { # n is the norm distribution size
  x <- rnorm(n)
  y <- rnorm(n)

  corrxy <- cor(x, y)
  corrxy # return the correlation (single value)
}

现在我们可以多次调用这个函数 replicate():

set.seed(123)
nrun <- 10
my_results <- replicate(nrun, my_sim(n=50))
#my_results
# [1] -0.0358698314 -0.0077403045 -0.0512509071 -0.0998484901  0.1230261286  0.1001124010 -0.0002023124
# [8]  0.2017120443  0.0644662387  0.0567232640

现在在 my_results 中,您拥有每个模拟的所有相关性(例如只有 10 个)。

你可以计算你的统计数据:

sum(abs(my_results)> 0.3) / nrun  # nrun is 10 

或情节:

hist(my_results)