From 8f6b6673e2b1552586174b7e7db7c1a8e8d574ba Mon Sep 17 00:00:00 2001 From: mattansb <35330040+mattansb@users.noreply.github.com> Date: Sun, 28 Feb 2021 08:50:31 +0200 Subject: [PATCH] Revert "Start using tidySEM (lesson 1)" This reverts commit 8c2237e7e40dfbaba366e6465994a67855e6e693. --- 01 path analysis/advanced plotting.R | 216 ++++++++++++--------------- 01 path analysis/path analysis.R | 27 +++- 01 path analysis/plot1.png | Bin 12717 -> 4400 bytes 01 path analysis/plot2.png | Bin 14337 -> 4682 bytes 4 files changed, 119 insertions(+), 124 deletions(-) diff --git a/01 path analysis/advanced plotting.R b/01 path analysis/advanced plotting.R index 3fa540f..27ad6b5 100644 --- a/01 path analysis/advanced plotting.R +++ b/01 path analysis/advanced plotting.R @@ -1,6 +1,5 @@ library(lavaan) -library(tidySEM) -library(dplyr) +library(semPlot) income_psych <- read.csv("income_psych.csv") @@ -12,84 +11,87 @@ fit <- sem(mediation_model, data = income_psych) ## See below for how "plot1.png" and "plot2.png" were made. -## Based on: -## https://cjvanlissa.github.io/tidySEM/articles/Plotting_graphs.html - - -# Changing the layout ----------------------------------------------------- - -lay <- get_layout(NA, "mood_neg", NA, - NA, NA, NA, - "anxiety", NA, "income", - rows = 3) - - - - -graph_data <- prepare_graph(fit, layout = lay, label = "est_std") - -plot(graph_data) - - - - # Adding var labels ------------------------------------------------------- -# We can add labels to our variables (our "nodes") by chaging the "label" column -# in the "nodes" part of the plot: - -(N <- nodes(graph_data)) +#' We can add labels to our variables with the `nodeLabels` argument. +#' However, for this we need to know the order in which `semPaths()` +#' "reads" the variables. We can do that like so: -nodes(graph_data) <- N %>% - mutate(label = c("Anxiety", "Income", "Negative Mood")) +semPlotModel(fit)@Vars -plot(graph_data) +semPaths(fit, + nodeLabels = c("Negative Mood", "Income", "Anxiety")) +# Other attributes -------------------------------------------------------- -# Adding / changing arrow labels ------------------------------------------ +#' You can play with other attributes of the plot by: +#' 1. Saving the plot into an object +#' 2. Changing the attributes `graphAttributes` +# Example of chaning the width and hight of nodes: +p <- semPaths(fit, + nodeLabels = c("Negative Mood", "Income", "Anxiety")) -(tab <- table_results(fit, columns = c("label", "est_std", "confint_std", "pval"), digits = 2)) +p$graphAttributes$Nodes$width <- c(10,10,20) +p$graphAttributes$Nodes$height <- c(20,5,5) -(E <- edges(graph_data)) +plot(p) -edges(graph_data) <- E %>% - mutate(est_std = tab$est_std, - label = paste0(round(est_std, 2), " ",tab$confint)) +# Example of nodes changing colors: +p$graphAttributes$Nodes$border.color <- c("black", "green", "red") -plot(graph_data) +plot(p) +# Manual Layout ----------------------------------------------------------- +#' Make a matrix with a row for each node, +#' and 2 columns +m <- matrix(NA, nrow = 3, ncol = 2) +# For each "row" (node), set the (x,y) coordinates. +# The order of rows is again taken from: +semPlotModel(fit)@Vars -# Even more --------------------------------------------------------------- +# (x,y)=(0,0) is the bottom left +m[1, ] <- c(2,0) +m[2, ] <- c(1,1) +m[3, ] <- c(0,0) +m -E <- edges(graph_data) +semPaths(fit, + layout = m) -edges(graph_data) <- E %>% - mutate( - # color lines by sign: - colour = case_when( - arrow == "both" ~ "black", - est_std < 0 ~ "red", - est_std > 0 ~ "green" - ), - # mark which is sig - linetype = c("dashed","dashed","solid", "dashed", "solid", "solid") - ) +# For a shiny app that can help, see +# https://mattansb.github.io/MSBMisc/reference/node_layout_maker.html +# https://mattansb.github.io/MSBMisc/reference/as_tbl_graph.lavaan.html -N <- nodes(graph_data) +# Final product ----------------------------------------------------------- -nodes(graph_data) <- N %>% - mutate(size = c(1,3,1)) -plot(graph_data) +m <- matrix(NA, nrow = 3, ncol = 2) +m[1, ] <- c(2,0) +m[2, ] <- c(1,1) +m[3, ] <- c(0,0) +p <- semPaths(fit, what = "std", whatLabels = "std", + residuals = TRUE, intercepts = FALSE, + # prettify + style = "lisrel", normalize = TRUE, fade = FALSE, + sizeMan = 11, sizeMan2 = 7, + sizeLat = 11, sizeLat2 = 7, + nCharNodes = 50, + edge.label.cex = 1, + # even more + layout = m, + nodeLabels = c("Negative Mood", "Income", "Anxiety")) +p$graphAttributes$Nodes$width <- c(20, 10, 10) +p$graphAttributes$Nodes$border.color <- c("black", "green", "red") +plot(p) # Making "plot1" ---------------------------------------------------------- @@ -101,40 +103,28 @@ mediation_model <- ' fit <- sem(mediation_model, data = income_psych) +semPlotModel(fit)@Vars +m <- matrix(NA, nrow = 3, ncol = 2) +m[1, ] <- c(2,0) +m[2, ] <- c(1,1) +m[3, ] <- c(0,0) +m -lay <- get_layout(NA, "mood_neg", NA, - "anxiety", NA, "income", - rows = 2) - -graph_data <- prepare_graph(fit, layout = lay) - -E <- edges(graph_data) -E$label <- "" -E$connect_from[3] <- "top" -E$connect_to[3] <- "left" -E$connect_from[2] <- "right" -E <- E[1:3,] -edges(graph_data) <- E - - - -(N <- nodes(graph_data)) -N$label <- c("Anxiety", "Income", "Negative Mood") -nodes(graph_data) <- N - - - - - -(p1 <- plot(graph_data)) - -# because the result it a ggplot, we will use ggsave to save it -ggplot2::ggsave(p1, filename = "plot1.png", width = 6, height = 3) - - +p1 <- semPaths(fit, whatLabels = "none", + residuals = FALSE, intercepts = FALSE, + # prettify + style = "lisrel", normalize = TRUE, + sizeMan = 11, sizeMan2 = 7, + sizeLat = 11, sizeLat2 = 7, + nCharNodes = 50, + edge.label.cex = 1, + nodeLabels = c("Income", "Negative Mood", "Anxiety"), + layout = m) +p1$graphAttributes$Nodes$width <- c(10,22,10) +plot(p1) # Making "plot2" ---------------------------------------------------------- @@ -147,38 +137,26 @@ mediation_model <- ' fit <- sem(mediation_model, data = income_psych) - - - - - -lay <- get_layout(NA, NA, "mood_neg", NA, - NA, "anxiety", NA, "income", - "shyness", NA, NA, NA, - rows = 3) - -graph_data <- prepare_graph(fit, layout = lay) - -E <- edges(graph_data) -E$label <- "" -E$connect_from[5] <- "top" -E$connect_to[5] <- "left" -E$connect_from[4] <- "top" -E$connect_to[4] <- "left" -E$connect_to[3] <- "bottom" -E <- E[1:5,] -edges(graph_data) <- E - -plot(graph_data) - -(N <- nodes(graph_data)) -N$label <- c("Anxiety", "Income", "Negative Mood", "Shyness") -N$node_xmin[3] <- N$node_xmin[3]-0.5 -N$node_xmax[3] <- N$node_xmax[3]+0.5 -nodes(graph_data) <- N - - -(p2 <- plot(graph_data)) - -# because the result it a ggplot, we will use ggsave to save it -ggplot2::ggsave(p2, filename = "plot2.png", width = 6, height = 3) +semPlotModel(fit)@Vars + +m <- matrix(NA, nrow = 4, ncol = 2) +m[1, ] <- c(2,0) +m[2, ] <- c(1,1) +m[3, ] <- c(0,0) +m[4, ] <- c(1,-1) +m + +p2 <- semPaths(fit, whatLabels = "none", + residuals = FALSE, intercepts = FALSE, + # prettify + style = "lisrel", normalize = TRUE, + sizeMan = 11, sizeMan2 = 7, + sizeLat = 11, sizeLat2 = 7, + nCharNodes = 50, + edge.label.cex = 1, + nodeLabels = c("Income", "Negative Mood", "Anxiety", "Shyness"), + layout = m) + +p2$graphAttributes$Nodes$width <- c(10,22,10, 12) + +plot(p2) diff --git a/01 path analysis/path analysis.R b/01 path analysis/path analysis.R index 87f02fa..e727b95 100644 --- a/01 path analysis/path analysis.R +++ b/01 path analysis/path analysis.R @@ -114,11 +114,28 @@ fit <- sem(mediation_model, data = income_psych, # Plotting ---------------------------------------------------------------- -library(tidySEM) - -graph_sem(fit) - -graph_sem(fit, label = "est_std") +library(semPlot) +# very (too?) customisable: +semPaths(fit) +semPaths(fit, whatLabels = "est") +semPaths(fit, whatLabels = "std") + +?semPaths # there are a million options! + +semPaths(fit, what = "std", whatLabels = "std", + residuals = TRUE, intercepts = FALSE, + # prettify + style = "lisrel", normalize = TRUE, + sizeMan = 11, sizeMan2 = 7, + sizeLat = 11, sizeLat2 = 7, + nCharNodes = 50, + edge.label.cex = 1) +# see `advanced plotting` for even more fine-tuning. + +library(lavaanPlot) +# pretty out of the box, but very very BUGGY! +lavaanPlot(model = fit) +lavaanPlot(model = fit, coefs = TRUE) # See also advanced plotting.R diff --git a/01 path analysis/plot1.png b/01 path analysis/plot1.png index 15802451e6de7673dd8b85930d5b62082bc9c7de..d2df81f356b5ff1ecf00005b4a23a6e5d95d4454 100644 GIT binary patch literal 4400 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 literal 12717 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 J`levv{~r_mh5-No diff --git a/01 path analysis/plot2.png b/01 path analysis/plot2.png index d1f0dd3452f0cbe153714630e3ef5a089bfaab82..6af21594b985b388432635975a9551a7bfc240df 100644 GIT binary patch literal 4682 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 A6aWAK literal 14337 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