Исключить узел в semPaths {semPlot}
Я пытаюсь проложить семейный путь с R.
Я использую выходной файл из Mplus с semPaths {semPLot}.
Видимо, это работает, но я хочу удалить некоторые скрытые переменные, и я не знаю, как.
Я использую следующий синтаксис:
Выход из Mplus: https://www.dropbox.com/s/vo3oa5fqp7wydlg/questedMOD2.out?dl=0
outfile1 <- "questedMOD.out"
```
semPaths(outfile1,what="est", intercepts=FALSE, rotation=4, edge.color="black", sizeMan=5, esize=TRUE, structural="TRUE", layout="tree2", nCharNodes=0, intStyle="multi" )
2 ответа
Может быть более простой способ сделать это (и игнорировать, если это целесообразно) - один из способов сделать это - удалить узлы из объекта перед построением.
Используя пример Mplus из вашего вопроса Поверните края в semPaths/qgraph
library(qgraph)
library(semPlot)
library(MplusAutomation)
# This downloads an output file from Mplus examples
download.file("http://www.statmodel.com/usersguide/chap5/ex5.8.out",
outfile <- tempfile(fileext = ".out"))
# Unadjusted plot
s <- semPaths(outfile, intercepts = FALSE)
В приведенном выше призыв к semPaths
, outfile
имеет класс character
, поэтому строка (около начала кода для semPaths
)
if (!"semPlotModel" %in% class(object))
object <- do.call(semPlotModel, c(list(object), modelOpts))
возвращает объект из semPlot:::semPlotModel.mplus.model(outfile)
, Это класса "semPlotModel"
,
Таким образом, идея состоит в том, чтобы сначала создать этот объект, изменить его, а затем передать этот объект semPaths
,
# Call semPlotModel on your Mplus file
obj <- semPlot:::semPlotModel.mplus.model(outfile)
# obj <- do.call(semPlotModel, list(outfile)) # this is more general / not just for Mplus
# Remove one factor (F1) from object@Pars - need to check lhs and rhs columns
idx <- apply(obj@Pars[c("lhs", "rhs")], 1, function(i) any(grepl("F1", i)))
obj@Pars <- obj@Pars[!idx, ]
class(obj)
obj
сейчас класса "semPlotModel"
и может быть передан непосредственно semPaths
s <- semPaths(obj, intercepts = FALSE)
Ты можешь использовать str(s)
чтобы увидеть структуру этого возвращаемого объекта.
Предполагая, что вы используете следующий код sempath для печати вашего SEM
semPaths(obj, intercepts = FALSE)%>%
plot()
вы можете использовать следующую функцию для удаления любого узла по его метке:
remove_nodes_and_edges <- function(semPaths_obj,node_tbrm_vec){
relevent_nodes_index <- semPaths_obj$graphAttributes$Nodes$names %in% node_tbrm_vec
semPaths_obj$graphAttributes$Nodes$width[relevent_nodes_index]=0
semPaths_obj$graphAttributes$Nodes$height[relevent_nodes_index]=0
semPaths_obj$graphAttributes$Nodes$labels[relevent_nodes_index]=""
return(semPaths_obj)
}
и используйте эту функцию в конвейере графика следующим образом
semPaths(obj, intercepts = FALSE) %>%
remove_nodes_and_edges(c("Y1","Y2","Y3")) %>%
plot()