Как рассчитать коэффициенты корреляции между наблюдениями и по классам - PullRequest
0 голосов
/ 30 октября 2019

У меня есть матрица данных, состоящая из 2000 фирм (организованных в строки) и 2 переменных (в столбце): размер (факторы: маленький, средний, большой) и расходы (числовые значения). Я хотел бы рассчитать по каждому классу размеров коэффициент корреляции между суммами расходов любой пары фирм (i, j), где i отличается от j. Это означает вычисление почти двух миллионов коэффициентов в целом (каждый класс размеров имеет различную нумерацию). Мои вопросы:

  1. Как мне кодировать рекурсивный процесс для расчета коэффициента корреляции для каждой пары фирм и по размеру класса?

  2. Я хотел бы организовать выходные коэффициенты в матрице корреляции 3x3 и представить ее тепловую карту, где представлены пары корреляций (малая, средняя), (малая, большая), (средняя, ​​большая) и т. Д. Как я могу продолжить?

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

У меня естьбезуспешно пытался адаптировать код, представленный здесь: корреляция по строке в пределах фрейма данных

name <- c("a", "b", "c", "d")     # 4 firms
size <- c("small", "small", "large", "medium") # size
expend <- c(43.80, 43.40, 37.64, 31.62)        # expenditures
df <- data.frame(name, size, expend)

as.factor(df$size)
as.numeric(df$expend)

cor.df <- data.frame(name1=NA, name2=NA,correl=NA) # empty correlation matrix

for(i in 1: (nrow(df) - 1))  {           # calculate correlation for each        
  for(j in (i+1): nrow(df) ) {           # pair in the sample and store it in 
    v1 <- as.numeric( df[i, 2:ncol(df)] )# cor.df
    v2 <- as.numeric( df[j, 2:ncol(df)] )
    correl <- cor(v1, v2)

    name1 <- df[i, "name"]
    name2 <- df[j, "name"]

    dftemp <- data.frame(name1, name2, correl)
    cor.df <- rbind(cor.df, dftemp)
  }
}

na.omit(cor.df)

     name1  name2  correl
  2     a     b      1
  3     a     c      1
  4     a     d      1
  5     b     c      1
  6     b     d      1
  7     c     d      1

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

small <-c(43.80, 43.40, 37.64, 31.62)
medium <-c(50.85, 3.40, 76.40, 21.42)
large <-c(100.80, 143.40, 237.14, 153.63)

mydata<-data.frame(small,medium,large)
mydata.cor = cor(mydata)
mydata.cor
             small      medium      large
small   1.00000000 -0.03687474 -0.4223156
medium -0.03687474  1.00000000  0.5227369
large  -0.42231558  0.52273686  1.0000000

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