Как найти коэффициент корреляции в цикле for, который должен повторяться 5000 раз?и сохранить статистику - PullRequest
0 голосов
/ 31 января 2019

для 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)

ожидается, что я получу5000 различных чисел коэффициентов сохраняются в [i], и при построении графика с использованием Hist (0) эти коэффициенты должны соответствовать приблизительно нормальному распределению.но я не понимаю, как работает цикл for и как включить значение коэффициента больше 0,3.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вот еще один способ выполнить этот вид моделирования без явного вызова цикла:

Сначала определите ваше моделирование:

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)
0 голосов
/ 31 января 2019

Я думаю, что вы были почти там.Вы просто должны были переместить некоторый код снаружи и внутри цикла for.

Вам нужны новые данные для каждого запуска цикла (в противном случае вы получаете одинаковую корреляцию 5000 раз), и вам необходимо сохранять корреляцию при каждом запуске цикла.В результате получается вектор из 5000 корреляций, который можно использовать для просмотра доли корреляций (поделенных на количество прогонов, а не на количество наблюдений), которые выше, чем .3 вне цикла for.

Редактировать: необходимо заключительное исправление в скобках абсолютной функции.Вы хотите найти абсолютные корреляции> .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.

enter image description here

...