Как использовать строки из списка в качестве переменных в mediate и lm в R? - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь запустить много анализов посредничества и сделать это быстрее Я пытаюсь поместить функции lm () и mediate () в цикл for.Затем я передаю список списков в цикл, где каждый элемент списка представляет собой список из трех в форме c ("", "", "").

Передача элементов в цикл и исключение из спискаих иметь одинарные строки для переменных X, M и Y - это нормально.Я пробовал много вариантов get (), eval () и assign () внутри функции mediate (), но безрезультатно.Я думаю, это связано с моим использованием get () в lm ().

То, как должен выглядеть мой код:

MedVarList <- list(c('SCI', 'rMEQ', 'SIDAS'))

for(i in MedVarList){
    X <- unlist((i)[1])
    M <- unlist((i)[2])
    Y <- unlist((i)[3])

    model.M <- lm(get(M) ~ get(X), data = NewScDat) 
    model.Y <- lm(get(Y) ~ get(X) + get(M), data = NewScDat)

    results <- mediate(model.M, model.Y, treat=get(X), mediator=get(M),
                       boot=TRUE, sims=500)
    }

Биты model.M и model.Y работают нормально.Это угощение = и посредник = внутри посредника (), которое я просто не могу понять.Я получаю эту ошибку:

Error in get(X) : object 'SCI' not found

Если я изменяю вызов mediate () для непосредственного включения имен переменных, я получаю другую ошибку:

results <- mediate(model.M, model.Y, treat='SCI', mediator='rMEQ', 
                   boot=TRUE, sims=500)

Error in `[.data.frame`(m.data, , treat) : undefined columns selected

Затем я подумал, что lm ()может быть, использовать «get (X)» в качестве имени переменной вместо «SCI», что get (X) выделяет изначально:

results <- mediate(model.M, model.Y, treat='get(X)', mediator='get(M)',
                   boot=TRUE, sims=500)

Error in get(M) : object 'rMEQ' not found

И просто чтобы проверить, что происходит, я посмотрел на то, что get(X) и get (M) теперь выплевывают:

get(X)

Error in get(X) : object 'SCI' not found

get(M)

Error in get(M) : object 'rMEQ' not found

Что я действительно пытаюсь достичь, так это иметь возможность запускать mediate () внутри цикла, используя список списков, как описано выше,Я делаю это, чтобы избежать повторения нескольких функций mediate () при ручной настройке.

1 Ответ

1 голос
/ 22 июня 2019

Вот мое MWE успешного решения:

library(mediation)

MedVarList <- list(c('SCI', 'rMEQ', 'SIDAS'))

for(i in MedVarList){
    X <- unlist((i)[1])
    M <- unlist((i)[2])
    Y <- unlist((i)[3])

    FormulaM <- paste(M,X,sep = " ~ ") # Results in a string "rMEQ ~ SCI"
    FormulaY <- paste(Y,"~", X,"+",M,sep=' ') # Results in a string "SIDAS ~ SCI + rMEQ"

    model.M <- lm(FormulaM, data=df) 
    model.Y <- lm(FormulaY, data=df)

    results <- mediate(model.M, model.Y, treat=X, mediator=M,
                      boot=TRUE, sims=500)
}

Спасибо за советы и предложения всем. @Parfait - я включил dput (), но не могли бы вы указать мне на FAQ или подобное объяснение причин этого?

РЕДАКТИРОВАТЬ - я понимаю, что такое dput () и делает сейчас, поэтому я удалил его из MWE, потому что использовал его не по назначению.

Более полный пример, включая полезную запись результатов для всех, кому это необходимо:

MedVarList <- list(c('SCI', 'rMEQ', 'SIDAS'))

NBootstraps = 5000
MediationResults <- list()

j <- 1

for(i in MedVarList){
    X <- unlist((i)[1])
    M <- unlist((i)[2])
    Y <- unlist((i)[3])

    FormulaM <- paste(M,X,sep = " ~ ")
    FormulaY <- paste(Y,"~", X,"+",M,sep=' ')

    model.M <- lm(FormulaM, data = NewScDat)
    model.Y <- lm(FormulaY, data = NewScDat)

    MediationResults[[j]] <- summary(mediate(model.M, model.Y, treat=X, mediator=M,
                                                         boot=TRUE, sims=NBootstraps))
    j <- j + 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...