У меня есть матрица данных, состоящая из 2000 фирм (организованных в строки) и 2 переменных (в столбце): размер (факторы: маленький, средний, большой) и расходы (числовые значения). Я хотел бы рассчитать по каждому классу размеров коэффициент корреляции между суммами расходов любой пары фирм (i, j), где i отличается от j. Это означает вычисление почти двух миллионов коэффициентов в целом (каждый класс размеров имеет различную нумерацию). Мои вопросы:
Как мне кодировать рекурсивный процесс для расчета коэффициента корреляции для каждой пары фирм и по размеру класса?
Я хотел бы организовать выходные коэффициенты в матрице корреляции 3x3 и представить ее тепловую карту, где представлены пары корреляций (малая, средняя), (малая, большая), (средняя, большая) и т. Д. Как я могу продолжить?
Разумно ли усреднять полученные коэффициенты корреляции в пределах одного и того же класса размеров, используя числовость класса?
У меня естьбезуспешно пытался адаптировать код, представленный здесь: корреляция по строке в пределах фрейма данных
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