Как применить функцию для коэффициента ранговой корреляции Спирмена в R?

Я хочу написать код для применения функции вычисления ранговой корреляции Спирмена между комбинациями столбцов из набора данных. У меня есть следующий набор данных:

library(openxlsx)
data <-read.xlsx("e:/LINGUISTICS/mydata.xlsx", 1);

A    B    C    D
go   see  get  eat
see  get  eat  go
get  go   go   get
eat  eat  see  see

Функция cor(rank(x), rank (y), method = «spearman») измеряет корреляцию только между двумя столбцами, например между A и B:

cor(rank(data$A), rank(data$B), method = "spearman")

Но мне нужно вычислить корреляцию между всеми возможными комбинациями столбцов (AB, AC, AD, BC, BD, CD). Для этого я написал следующую функцию:

wert <- function(x, y) { cor(rank(x), rank(y), method = "spearman") }

Я не знаю, как реализовать все возможные комбинации столбцов (AB, AC, AD, BC, BD, CD) в моей функции, чтобы получить все результаты автоматически, потому что мои реальные данные имеют гораздо больше столбцов, а также как матрица с корреляционными оценками, например, как следующая таблица:

    A     B     C     D
A   1     0.3   0.4   0.8
B   0.3   1     0.6   0.5
C   0.4   0.6   1     0.1
D   0.8   0.5   0.1   1

Кто-нибудь может мне помочь?

2 ответа

  1. Вам это не нужно rank. corуже вычисляет ранговую корреляцию Спирмена method = "spearman". Если требуется корреляция между всеми столбцами данных.кадр, просто передайте данные.кадр кcor, То cor(data, method = "spearman")есть . Вы должны учиться help("cor").

    Если вы хотите сделать это вручную, используйте combnфункцию.

    PS: ваша дополнительная проблема заключается в том, что у вас на самом деле есть факторные переменные. Ранг для неупорядоченного фактора является странным понятием, но R просто использует порядок сортировки здесь. Так corкак правильно ожидает числовой ввод, вы должны сделать data[] <- lapply(data, as.integer)первый.

  2. Я думаю, что вы можете просто сделать функцию (pairedcolumns), которая затем применит вашу функцию (spearman) к каждой паре столбцов в фрейме данных, который вы ее передаете.

    #This function works on a data frame (x) usingwhichever other function (fun) you select by making all pairs of columns possible.
    pairedcolumns <- function(x,fun) 
    {
      n <- ncol(x)##find out how many columns are in the data frame
    
      foo <- matrix(0,n,n)
      for ( i in 1:n)
      {
        for (j in 1:n)
        {
          foo[i,j] <- fun(x[,i],x[,j])
    }
    }
     colnames(foo)<-rownames(foo)<-colnames(x)
    return(foo)
    }
    
     results<-pairedcolumns(yourdataframe[,2:8], function)