2 votes

Pourquoi les coefficients de corrélation polychorique dans les matrices calculés par différents packages R sont-ils légèrement différents pour les mêmes données ?

J'ai calculé des matrices de corrélation polychorique pour le même cadre de données (20 variables ordinales, 190 valeurs manquantes) dans R, en utilisant trois paquets différents et les coefficients pour les mêmes variables sont légèrement différents les uns des autres.

J'ai utilisé la fonction lavCor de " lavaan "(j'ai listé les variables ordinales lors de l'appel de la fonction), fonction polychorique de " psych " (1.9.1) (a pris les rhos), et la fonction cor_auto de " qgraph "(qui est censé calculer automatiquement les corrélations polychoriques pour les données ordinales). Je suis confus car je pensais qu'ils étaient censés donner exactement les mêmes résultats. J'ai lu les documentations des paquets mais je n'ai rien trouvé qui m'aide à comprendre pourquoi. Quelqu'un peut-il me dire pourquoi cela se produit ? Je suis sûr qu'il me manque une petite différence entre les deux, mais je n'arrive pas à la comprendre.

PS : Je suppose que cela a pu se produire parce que le paquet psych ajuste les valeurs manquantes (j'en ai 190) en utilisant la correction pour la continuité, mais je ne comprends toujours pas pourquoi qgraph donne des résultats différents de ceux de lavaan puisque qgraph dit utiliser la fonction lavCor de lavaan pour calculer les corrélations polychoriques.

Merci !

depanx<-data[1:20]

cor.depanx<-cor_auto(depanx)

polychor<-polychoric(depanx)
polymat<-polychor$rho

lav<-lavCor(depanx,ordered=c("unh","enj","trd","rst","noG","cry","cnc","htd","bdp","lnl","lov",
                             "cmp","wrg","pst","sch","dss","hlt","bad","ftr","oth"))

# as a result, matrices "cor.depanx", "polymat", and "lav" are different from each other.

1voto

InterestedInR Points 86

Bonne question ! Je ne sais pas quel est le jeu de données "data" dans votre exemple, mais j'ai recréé les deux scénarios possibles, qui ont très probablement causé la divergence entre les résultats de cor_auto et lavCor. En résumé, vous devez d'abord définir l'argument "ordinalLevelMax" dans cor_auto en fonction de vos données et ensuite vous devez synchroniser l'argument "missing" dans les deux fonctions. L'explication détaillée se trouve dans l'extrait de code ci-dessous :

depanx<-data.frame(lapply(1:5,function(x)sample(1:6,100,replace = T)),
stringsAsFactors = F)
colnames(depanx)=LETTERS[1:5]
lav<-lavaan::lavCor(depanx,ordered=colnames(depanx))
cor.depanx<-cor_auto(depanx)
all(lav==cor.depanx)#TRUE

#The first argument in cor auto, which you need to pay attention to is 
#"ordinalLevelMax". #It is set to 7 by default in cor_auto,
#so any variable with levels more than 7 is sent to lavCor as plain numeric and not 
#ordinal. 
#Now we create the same dataset with 8 level variables. lavCor detects all as ordinal,
#since we have labeled them as so by "ordered" argument of lavCor, so it uses 
#ploychorial
#correlations. Since "ordinalLevelMax" in cor_auto is 7 by default and you have not 
#changed it,
#cor_auto detect none as ordinaland does not send them to lavCor as Ordinalvariables, 
#so Lavcor computes pearson correlations between them,all.
depanx2<-data.frame(lapply(1:5,function(x)sample(1:8,100,replace =T)),
stringsAsFactors = F)
colnames(depanx2)=LETTERS[1:5]
lav2<-lavaan::lavCor(depanx2,ordered=colnames(depanx2))
cor.depanx2<-cor_auto(depanx2)
all(lav2==cor.depanx2)#FALSE

# the next argument you must synchronise in lavCor and cor_auto is the "missing",
#which is by default set to "pairwise" and "listwise" in cor_auto and lavCor, 
#respectively.
#here we set row 10:20 value of the fifth variable to NA, without synchronizing the 
#argument
depanx3<-data.frame(lapply(1:5,function(x)sample(1:6,100,replace =T)),
stringsAsFactors = F)
colnames(depanx3)=LETTERS[1:5]
depanx3[10:20,5]<-NA
lav3<-lavaan::lavCor(depanx3,ordered=colnames(depanx3))
cor.depanx3<-cor_auto(depanx3)
all(lav3==cor.depanx3)#FALSE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X