Коэффициент корреляции от рандомизированных переменных в R - PullRequest
0 голосов
/ 03 мая 2020

Моя цель - получить новую переменную коэффициентов корреляции (копий), где каждое число соответствует корреляции между двумя рандомизированными переменными.

например,

var1=c(1, 2, 3, 0, 2)
var2=c(3, 6, 0, 1, 2)

Я пробовал

set.seed(1)
f1=numeric(10000)
for (i in 1:10000) {rand <- replicate(10000, sample(var1))
 rand1 <- replicate(10000, sample(var2))
 f1[i]=cor(rand, rand1, use ="everything", method=c("spearman"))
 } 

, которое выдает мне следующее сообщение: Предупреждение: в f1 [i] = cor (rand, rand1, use = "everything", method = c ("spearman")): количество предметов заменить не кратно длине замены

Я пробовал это:

cof <- cor((replicate(1000, sample(var1))), (replicate(1000, sample(var2))), use ="everything", method=c("spearman"))

, которая возвращает матрицу коэффициентов корреляции для каждого значения, а не для каждой переменной

В качестве альтернативы, если есть способ попросить R соотнести, например, строку 1 в одном фрейме данных со строкой 1 в другом, то со строками 2, затем строками 3 и c я могу получить матрицы только из моих рандомизированных переменных с помощью этого:

set.seed(1)
f1=numeric(10000)
for (i in 1:10000) {rand <- replicate(10000, sample(var1))
  rand1 <- replicate(10000, sample(var2))
  }

, который я тогда должен был бы коррелировать друг с другом

есть ли способ рассчитать коэффициент корреляции между каждой парой рандомизированных переменных по мере их генерирования, а затем создать новую переменную ма де коэффициенты корреляции для каждой рандомизации?

Спасибо

Ответы [ 3 ]

0 голосов
/ 03 мая 2020

Я думаю, что вам должно быть проще просто использовать фактическую формулу корреляции Спирмена, без использования cor ().

Это будет выглядеть так:

spearman<-function(x,y){
  X<-as.matrix(x)
  Y<-as.matrix(y)
  y<-rowSums(X)
  a<-rowSums(Y)
  spearman<-2*cor(y,a)/(1+cor(y,a))
  return(spearman)
}

После выполнения этого вы можете затем использовать

spearman(data1$firstrow,data2$secondrow)

для вычисления желаемых корреляций.

И тогда, я думаю, вы могли бы использовать что-то вроде l oop, например:

for (i in nrow(dat)) {
  for (i in nrow(dat)) {
  correlation<-spearman(datmat[i,],datmat2[i,])
  print(correlation[i])
  }
}
0 голосов
/ 03 мая 2020

Что касается вашего второго вопроса, кажется, что ваши матрицы rand и rand1 имеют 5 строк и много столбцов, и вы хотели бы сопоставить каждый столбец из rand с эквивалентным столбцом из rand1? Если бы я понял это правильно, вы могли бы использовать cor.test для получения корреляции ранга копейщика, например, в oop. Поскольку это относительно медленно, вы также можете переписать формулу для ранговой корреляции Спирмена в векторизованной форме и использовать ее (см. Ниже). Если вас интересуют построчные корреляции, матрицы можно легко настроить или транспонировать.

var1=c(1, 2, 3, 0, 2)
var2=c(3, 6, 0, 1, 2)
set.seed(1)
n=10000
rand <- replicate(n, sample(var1))
rand1 <- replicate(n, sample(var2))

library(matrixStats)
colwiseSpearman <- function(m1, m2, correct=TRUE){
    require(matrixStats)
    n <- dim(m1)[2]
    l <- dim(m1)[1]
    if (correct){
        Txy <- t(sapply(seq_len(n), function(x){
            t0 <- tabulate(rand[,x])
            t1 <- tabulate(rand1[,x])
            return(c(Tx=sum(t0^3-t0)/12, Ty=sum(t1^3-t1)/12))
        }))
        return(((l^3-l)/6 - rowSums((colRanks(rand, ties.method="average")-colRanks(rand1, ties.method="average"))^2) - Txy[,1] - Txy[,2])/sqrt(((l^3-l)/6 - 2*Txy[,1])*((l^3-l)/6 - 2*Txy[,2]))) # Spearman cor.coeff. corrected for ties 
    } else {
        return(1-(6*rowSums((colRanks(rand, ties.method="average")-colRanks(rand1, ties.method="average"))^2) / (l^3-l)))}
}

library(microbenchmark)
microbenchmark(a=colwiseSpearman(rand, rand1),
               b=as.numeric(sapply(seq_len(n), function(x) cor.test(rand[,x], rand1[,x], method="spearman")$estimate)), times=10L )
#> Unit: milliseconds
#>  expr        min         lq       mean    median         uq       max neval cld
#>     a   65.47719   68.06543   74.83393   69.2682   72.90266  109.9133    10  a 
#>     b 2769.97084 2789.39907 2826.01399 2821.6867 2849.08012 2880.5115    10   b
a <- colwiseSpearman(rand, rand1)
b <- as.numeric(sapply(seq_len(n), function(x) cor.test(rand[,x], rand1[,x], method="spearman")$estimate))
all.equal(a, b)
#> [1] TRUE

Создано в 2020-05-03 пакетом Представить (v0 .3.0)

0 голосов
/ 03 мая 2020

Я не совсем уверен, что понимаю, что вы пытались сделать. Возможно, это решит вашу проблему:

var1=c(1, 2, 3, 0, 2)
var2=c(3, 6, 0, 1, 2)

set.seed(1)
n=100
rand <- replicate(n, sample(var1))
rand1 <- replicate(n, sample(var2))

# That is maybe what you are searching for
f1 <- apply(rand,2,cor,rand1)

У вас будет матрица nxn , где каждая (i, j) представляет корреляцию между i столбец ранда и j столбец ранда1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...