Pacote Metafor: diagnóstico de viés e sensibilidade

9

Estou conduzindo uma meta-análise multinível que inclui alguns artigos com vários resultados. Portanto, eu estou usando a rma.mv()função Código de exemplo:

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

Eu tenho duas perguntas:

  1. Li em uma consulta anterior que, ao usar rma.mv(), ranktest()não é um teste confiável de assimetria de plotagem de funil. No entanto, se a variação da amostra foi adicionada ao modelo original como moderador, esse modelo seria semelhante ao teste de Egger:

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

    Esse código é uma interpretação correta dessa orientação? Além disso, os gráficos de funil também são (mais ou menos) inúteis como uma ferramenta nos rma.mv()modelos?

  2. Nem leave1out()nem trimfill()trabalho com rma.mv()para avaliar a sensibilidade dos resultados do modelo. Existem outras ferramentas de análise de sensibilidade atualmente disponíveis para rma.mv()modelos que não envolvem uma compreensão magistral de R?

chabeck
fonte

Respostas:

8

Em relação a 1: Sim, adicionar vicomo moderador é realmente a maneira lógica de estender o teste de Egger para modelos mais complexos.

Na verdade, usar as variações de amostragem como moderador é apenas uma possibilidade de realizar o "teste de regressão para assimetria do gráfico de funil". Outros sugeriram usar o inverso das variações de amostragem ou os erros padrão (raiz quadrada das variações de amostragem) ou seus inversos ou o tamanho total da amostra (ou alguma função dela) como moderadores. Não está totalmente claro qual preditor é a "melhor" opção (e isso pode depender de qual medida de resultado você usa para sua metanálise). Por exemplo, para algumas medidas, a equação que usamos para aproximar / estimar a variância amostral é na verdade uma função do resultado observado, que cria automaticamente uma relação entre os dois, mesmo na ausência de viés de publicação (ou "viés de pequeno estudo" ou o que quisermos chamar). Nesse caso,

Mas o ponto principal é: Sim, o teste de regressão pode ser facilmente aplicado ao trabalhar com modelos mais complexos, adicionando um moderador apropriado ao modelo.

É discutível se as plotagens de funil são úteis ou não quando existem estruturas multiníveis / multivariadas subjacentes aos dados. Por exemplo, conjuntos de pontos podem se agrupar devido a dependências estatísticas (que são contabilizadas ao usar um modelo multinível / multivariado apropriado), mas no gráfico de funil, os pontos são exatamente isso: um monte de pontos. Isso torna a interpretação das plotagens de funil mais difícil porque (a menos que você tome medidas extras usando cores ou símbolos diferentes), você não pode ver essas dependências inerentes - não que a maioria das pessoas (inclusive eu) seja boa em interpretar plotagens de funil, mesmo das mais simples. casos (há pesquisas empíricas demonstrando isso!).

No que diz respeito a 2: Sim, atualmente várias funções de ajuste de pós-modelo não funcionam com rma.mvobjetos de modelo. Eu simplesmente não consegui implementar isso e parte disso realmente exigirá alguma reflexão. Por exemplo, leave1out()remove um estudo de cada vez - no contexto univariado, isso equivale a remover cada resultado observado por vez, mas e os dados multiníveis / multivariados? Também remover cada resultado observado de cada vez? Ou remover conjuntos de pontos? Ou disponibilizar diferentes opções? Com relação ao aparar e preencher (deixando de lado a questão de quão útil esse método é realmente): Estender o método para dados multiníveis / multivariados valeria a pena escrever um artigo inteiro.

Portanto, é ótimo que você queira fazer análises de sensibilidade, mas, a partir de agora, precisará fazer isso manualmente. As análises de deixar um fora são facilmente feitas com um loop for simples e pensando cuidadosamente sobre o que é "um" (por exemplo, cada resultado observado, cada cluster / estudo). Você pode fazer o teste de regressão e talvez deixar o aparar e preencher por enquanto. Os resíduos padronizados estão disponíveis via rstandard(), para que você possa examinar os dados quanto a possíveis discrepâncias. Você pode obter os valores do chapéu via hatvalues()(apenas as alavancas ao longo da diagonal ou de toda a matriz do chapéu ), que fornece uma indicação de quais pontos influenciam fortemente os resultados. Outra medida realmente útil nesse contexto é a distância de Cook , que você pode obter via cooks.distance()também para rma.mvobjetos.

Wolfgang
fonte
2
Uau! Obrigado por suas respostas completas e atenciosas. Vou tentar descobrir como usar o código do loop for, como você sugere.
chabeck
11
Fico feliz em saber que você achou isso útil. As várias funções de ajuste de modelo, incluindo rma.mv()um subsetargumento, podem ser usadas facilmente em conjunto com um loop for para eliminar (conjuntos de) resultados observados.
9119 Wolfgang #
4
Wolfgang, o produto de suas sugestões pode ser observado aqui: aobpla.oxfordjournals.org/content/7/… Obrigado novamente!
chabeck