如何在要重复 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)
对于 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)