У меня есть опрос с большим количеством числовых переменных (как непрерывных, так и фиктивных) и более 800 наблюдений. Конечно, по большинству переменных отсутствуют данные (с другой скоростью). Мне нужно использовать таблицу взвешенной корреляции, потому что некоторые выборки представляют больше населения, чем другие. Кроме того, я хочу свести к минимуму неиспользуемые образцы и, таким образом, сохранить макс. наблюдений для каждой пары переменных. Я знаю, как составить матрицу парной корреляции (например, cor(data, use = "pairwise.complete.obs")
). Также я знаю, как сделать взвешенную корреляционную матрицу (например, cov.wt(data %>% select(-weight), wt=data$weight, cor=TRUE)
). Однако я не смог найти способ (пока) использовать оба вместе. Есть ли способ сделать попарно взвешенную корреляционную матрицу в R? Супер признателен за любую помощь или рекомендации.
Хороший вопрос Вот как я это делаю Это не быстро, но быстрее, чем зацикливание.
df_correlation - это фрейм данных только с переменными, которые я хочу вычислить корреляции и newdf - мой исходный фрейм данных с весом и другими переменными
data_list <- combn(names(df_correlation),2,simplify = FALSE)
data_list <- map(data_list,~c(.,"BalancingWeights"))
dimension <- length(names(df_correlation))
allcorr <- matrix(data =NA,nrow = dimension,ncol = dimension)
row.names(allcorr)<-names(df_correlation)
colnames(allcorr) <- names(df_correlation)
myfunction<- function(data,x,y,weight){
indice <-!(is.na(data[[x]])|is.na(data[[y]]))
return(wCorr::weightedCorr(data[[x]][indice],
data[[y]][indice], method = c("Pearson"),
weights = data[[weight]][indice], ML = FALSE, fast = TRUE))
}
b <- map_dbl(data_list,~myfunction(newdf,.[1],.[2],.[3]))
allcorr[upper.tri(allcorr, diag = FALSE)]<- b
allcorr[lower.tri(allcorr,diag=FALSE)] <- b
view(allcorr)