Package Metafor: diagnostics de biais et de sensibilité

9

Je mène une méta-analyse à plusieurs niveaux qui comprend des articles aux résultats multiples. Par conséquent, j'utilise la rma.mv()fonction. Exemple de code:

test.main = rma.mv(yi,vi,random = ~1|ID, data = data) 

J'ai deux questions:

  1. J'ai lu dans une requête précédente que lors de l'utilisation rma.mv(), ce ranktest()n'est pas un test fiable d'asymétrie du graphique en entonnoir. Cependant, si la variance de l'échantillon était ajoutée au modèle d'origine en tant que modérateur, ce modèle serait similaire au test d'Egger:

    test.egger = rma.mv(yi,vi, mod = vi, random = ~1|ID, data = data)
    

    Ce code est-il une interprétation correcte de ces directives? De plus, les tracés en entonnoir sont-ils (plus ou moins) inutiles comme outil avec des rma.mv()modèles?

  2. Ni leave1out()ni trimfill()travailler avec rma.mv()pour évaluer la sensibilité des résultats du modèle. Existe-t-il actuellement d'autres outils d'analyse de sensibilité pour les rma.mv()modèles qui n'impliquent pas une compréhension magistrale de R?

chabeck
la source

Réponses:

8

Concernant 1: Oui, l'ajout en vitant que modérateur est en effet la manière logique d'étendre le test d'Egger à des modèles plus complexes.

En fait, l'utilisation des variances d'échantillonnage comme modérateur n'est qu'une des possibilités de réaliser le «test de régression de l'asymétrie du graphique en entonnoir». D'autres ont suggéré d'utiliser l'inverse des variances d'échantillonnage ou des erreurs types (racine carrée des variances d'échantillonnage) ou leurs inverses ou la taille totale des échantillons (ou une fonction de ceux-ci) comme modérateurs. Il n'est pas entièrement clair quel prédicteur est le "meilleur" choix (et cela peut dépendre de la mesure des résultats que vous utilisez pour votre méta-analyse). Par exemple, pour certaines mesures, l'équation que nous utilisons pour approximer / estimer la variance d'échantillonnage est en fait une fonction du résultat observé, ce qui crée automatiquement une relation entre les deux même en l'absence de biais de publication (ou «biais de petite étude» ou comme nous voulons l'appeler). Dans ce cas,

Mais le point principal est: Oui, le test de régression peut être facilement appliqué lorsque vous travaillez avec des modèles plus complexes en ajoutant un modérateur approprié au modèle.

L'utilité ou non des tracés en entonnoir lorsqu'il existe des structures multiniveaux / multivariées sous-jacentes aux données est discutable. Par exemple, des ensembles de points peuvent se regrouper en raison de dépendances statistiques (qui sont prises en compte lors de l'utilisation d'un modèle approprié à plusieurs niveaux / multivariés), mais dans le graphique en entonnoir, les points ne sont que cela: un tas de points. Cela rend l'interprétation des tracés en entonnoir plus difficile car (à moins que vous ne preniez des mesures supplémentaires en utilisant différentes couleurs ou symboles), vous ne pouvez pas voir ces dépendances inhérentes - pas que la plupart des gens (moi y compris) sont capables d'interpréter les tracés en entonnoir, même dans les plus simples (des recherches empiriques le démontrent!).

En ce qui concerne 2: Oui, un tas de fonctions de post ajustement du modèle ne fonctionnent actuellement pas avec les rma.mvobjets du modèle. Je n'ai tout simplement pas réussi à mettre en œuvre cela et certains d'entre eux nécessiteront une réflexion. Par exemple, leave1out()supprime une étude à la fois - dans le contexte univarié, cela équivaut à supprimer chaque résultat observé à la fois, mais qu'en est-il des données multiniveaux / multivariées? Supprimer également chaque résultat observé à la fois? Ou supprimer des ensembles de points? Ou proposer différentes options? En ce qui concerne le trim-and-fill (en laissant de côté la question de l'utilité réelle de cette méthode): étendre la méthode aux données multiniveaux / multivariées vaut la peine d'écrire un article entier.

Donc, c'est génial que vous vouliez faire des analyses de sensibilité, mais à partir de maintenant, vous devrez le faire manuellement. Les analyses avec oubli sont faciles à faire avec une simple boucle for et en réfléchissant soigneusement à ce qu'est "un" (par exemple, chaque résultat observé, chaque groupe / étude). Vous pouvez faire le test de régression et peut-être laisser le trim-and-fill être pour l'instant. Les résidus standardisés sont disponibles via rstandard(), vous pouvez donc examiner les données pour les valeurs aberrantes potentielles. Vous pouvez obtenir les valeurs de chapeau via hatvalues()(uniquement les leviers le long de la diagonale ou la matrice de chapeau entière ) qui vous donne une indication des points qui ont une forte influence sur les résultats. Une autre mesure vraiment utile dans ce contexte est la distance de Cook , que vous pouvez obtenir via cooks.distance(), également pour les rma.mvobjets.

Wolfgang
la source
2
Hou la la! Merci pour vos réponses réfléchies et approfondies. Je vais essayer de comprendre comment utiliser le code for-loop, comme vous le suggérez.
chabeck
1
Heureux d'apprendre que vous avez trouvé cela utile. Les différentes fonctions d'ajustement de modèle rma.mv()ont notamment un subsetargument que vous pouvez facilement utiliser avec une boucle for pour supprimer (ensembles de) résultats observés.
Wolfgang
5
Wolfgang, le produit de vos suggestions peut être observé ici: aobpla.oxfordjournals.org/content/7/… Merci encore!
chabeck