{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "47c70580",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Loading required package: MASS\n",
"\n",
"Loading required package: Matrix\n",
"\n",
"Loading required package: mvtnorm\n",
"\n",
"Loading required package: sandwich\n",
"\n",
"mediation: Causal Mediation Analysis\n",
"Version: 4.5.0\n",
"\n",
"\n",
"Loading required package: nlme\n",
"\n",
"Warning message:\n",
"“package ‘lavaan’ was built under R version 4.2.3”\n",
"This is lavaan 0.6-17\n",
"lavaan is FREE software! Please report any bugs.\n",
"\n"
]
}
],
"source": [
"library(mediation)\n",
"library(multilevel)\n",
"library(lavaan)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1353a5cc",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"A data.frame: 6 × 3\n",
"\n",
"\t | X | M | Y |
\n",
"\t | <int> | <int> | <int> |
\n",
"\n",
"\n",
"\t1 | 6 | 5 | 6 |
\n",
"\t2 | 7 | 5 | 5 |
\n",
"\t3 | 7 | 7 | 4 |
\n",
"\t4 | 8 | 4 | 8 |
\n",
"\t5 | 4 | 3 | 5 |
\n",
"\t6 | 4 | 4 | 7 |
\n",
"\n",
"
\n"
],
"text/latex": [
"A data.frame: 6 × 3\n",
"\\begin{tabular}{r|lll}\n",
" & X & M & Y\\\\\n",
" & & & \\\\\n",
"\\hline\n",
"\t1 & 6 & 5 & 6\\\\\n",
"\t2 & 7 & 5 & 5\\\\\n",
"\t3 & 7 & 7 & 4\\\\\n",
"\t4 & 8 & 4 & 8\\\\\n",
"\t5 & 4 & 3 & 5\\\\\n",
"\t6 & 4 & 4 & 7\\\\\n",
"\\end{tabular}\n"
],
"text/markdown": [
"\n",
"A data.frame: 6 × 3\n",
"\n",
"| | X <int> | M <int> | Y <int> |\n",
"|---|---|---|---|\n",
"| 1 | 6 | 5 | 6 |\n",
"| 2 | 7 | 5 | 5 |\n",
"| 3 | 7 | 7 | 4 |\n",
"| 4 | 8 | 4 | 8 |\n",
"| 5 | 4 | 3 | 5 |\n",
"| 6 | 4 | 4 | 7 |\n",
"\n"
],
"text/plain": [
" X M Y\n",
"1 6 5 6\n",
"2 7 5 5\n",
"3 7 7 4\n",
"4 8 4 8\n",
"5 4 3 5\n",
"6 4 4 7"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Source: https://library.virginia.edu/data/articles/introduction-to-mediation-analysis\n",
"# X: grades; Y: happiness; M: self-esteem\n",
"myData = read.csv('http://static.lib.virginia.edu/statlab/materials/data/mediationData.csv')\n",
"head(myData)"
]
},
{
"cell_type": "markdown",
"id": "c34146d2",
"metadata": {},
"source": [
"## Baron & Kenny’s 4-step method"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "8fd54b14",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\n",
"Call:\n",
"lm(formula = Y ~ X, data = myData)\n",
"\n",
"Residuals:\n",
" Min 1Q Median 3Q Max \n",
"-5.0262 -1.2340 -0.3282 1.5583 5.1622 \n",
"\n",
"Coefficients:\n",
" Estimate Std. Error t value Pr(>|t|) \n",
"(Intercept) 2.8572 0.6932 4.122 7.88e-05 ***\n",
"X 0.3961 0.1112 3.564 0.000567 ***\n",
"---\n",
"Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1\n",
"\n",
"Residual standard error: 1.929 on 98 degrees of freedom\n",
"Multiple R-squared: 0.1147,\tAdjusted R-squared: 0.1057 \n",
"F-statistic: 12.7 on 1 and 98 DF, p-value: 0.0005671\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Step 1: Total effect = Path c = 0.3961***\n",
"model.0 = lm(Y ~ X, data=myData)\n",
"summary(model.0)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "88235b89",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\n",
"Call:\n",
"lm(formula = M ~ X, data = myData)\n",
"\n",
"Residuals:\n",
" Min 1Q Median 3Q Max \n",
"-4.3046 -0.8656 0.1344 1.1344 4.6954 \n",
"\n",
"Coefficients:\n",
" Estimate Std. Error t value Pr(>|t|) \n",
"(Intercept) 1.49952 0.58920 2.545 0.0125 * \n",
"X 0.56102 0.09448 5.938 4.39e-08 ***\n",
"---\n",
"Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1\n",
"\n",
"Residual standard error: 1.639 on 98 degrees of freedom\n",
"Multiple R-squared: 0.2646,\tAdjusted R-squared: 0.2571 \n",
"F-statistic: 35.26 on 1 and 98 DF, p-value: 4.391e-08\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Step 2: Path a = 0.56102***\n",
"model.XM = lm(M ~ X, data=myData)\n",
"summary(model.XM)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "48ed6977",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\n",
"Call:\n",
"lm(formula = Y ~ X + M, data = myData)\n",
"\n",
"Residuals:\n",
" Min 1Q Median 3Q Max \n",
"-3.7631 -1.2393 0.0308 1.0832 4.0055 \n",
"\n",
"Coefficients:\n",
" Estimate Std. Error t value Pr(>|t|) \n",
"(Intercept) 1.9043 0.6055 3.145 0.0022 ** \n",
"X 0.0396 0.1096 0.361 0.7187 \n",
"M 0.6355 0.1005 6.321 7.92e-09 ***\n",
"---\n",
"Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1\n",
"\n",
"Residual standard error: 1.631 on 97 degrees of freedom\n",
"Multiple R-squared: 0.373,\tAdjusted R-squared: 0.3601 \n",
"F-statistic: 28.85 on 2 and 97 DF, p-value: 1.471e-10\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Step 3 & 4: Path b + Path c'\n",
"# Path b = 0.6355***\n",
"# Path c'= 0.0396\n",
"model.MY.XY = lm(Y ~ X + M, data=myData)\n",
"summary(model.MY.XY)"
]
},
{
"cell_type": "markdown",
"id": "49cfe740",
"metadata": {},
"source": [
"Interpretation:\n",
"- The total effect model shows a significant positive relationship between grades(X) and happiness(Y).\n",
" - Path c = 0.3961***\n",
"- The path a model shows grades(X) positively correlate with self-esteem(M) and the relationship is statistically significant.\n",
" - Path a = 0.56102***\n",
"- Self-esteem(M) positively predicts happiness(Y) when controlling grades(X). At the same time, the relationship between grades(X) and happiness(Y) is no longer significant.\n",
" - Path b = 0.6355***\n",
" - Path c'= 0.0396\n",
"- This suggests that self-esteem(M) completely mediates the relationship between grades(X) and happiness(Y).\n",
" - However, this method cannot directly evaluate the significance of the indirect effect (i.e. ab≠0) - we need a formal test for a statistical verification."
]
},
{
"cell_type": "markdown",
"id": "8f03de5c",
"metadata": {},
"source": [
"## Sobel Test\n",
"\n",
"Determine the significance of the indirect effect."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "d01577b1",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"'indirect effect: 0.356522196728078'"
],
"text/latex": [
"'indirect effect: 0.356522196728078'"
],
"text/markdown": [
"'indirect effect: 0.356522196728078'"
],
"text/plain": [
"[1] \"indirect effect: 0.356522196728078\""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"'z-statistic: 4.32789111803173'"
],
"text/latex": [
"'z-statistic: 4.32789111803173'"
],
"text/markdown": [
"'z-statistic: 4.32789111803173'"
],
"text/plain": [
"[1] \"z-statistic: 4.32789111803173\""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"'p-value: 1.5054385481994e-05'"
],
"text/latex": [
"'p-value: 1.5054385481994e-05'"
],
"text/markdown": [
"'p-value: 1.5054385481994e-05'"
],
"text/plain": [
"[1] \"p-value: 1.5054385481994e-05\""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 手动计算: https://www.spss-tutorials.com/sobel-test-what-is-it/\n",
"alpha = summary(model.XM)$coefficients[\"X\",\"Estimate\"]\n",
"se_alpha = summary(model.XM)$coefficients[\"X\",\"Std. Error\"]\n",
"beta = summary(model.MY.XY)$coefficients[\"M\",\"Estimate\"]\n",
"se_beta = summary(model.MY.XY)$coefficients[\"M\",\"Std. Error\"]\n",
"\n",
"z.statistic = (alpha * beta)/(sqrt(alpha*alpha*se_beta*se_beta + beta*beta*se_alpha*se_alpha))\n",
"p.value = 2*(1-pnorm(z.statistic)) # two-tailed\n",
"\n",
"sprintf(\"indirect effect: %s\", alpha*beta)\n",
"sprintf(\"z-statistic: %s\", z.statistic)\n",
"sprintf(\"p-value: %s\", p.value)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0c2f0ef6",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\t- $`Mod1: Y~X`
\n",
"\t\t\n",
"A matrix: 2 × 4 of type dbl\n",
"\n",
"\t | Estimate | Std. Error | t value | Pr(>|t|) |
\n",
"\n",
"\n",
"\t(Intercept) | 2.8572046 | 0.6932130 | 4.121684 | 7.875771e-05 |
\n",
"\tpred | 0.3961261 | 0.1111598 | 3.563574 | 5.671128e-04 |
\n",
"\n",
"
\n",
" \n",
"\t- $`Mod2: Y~X+M`
\n",
"\t\t\n",
"A matrix: 3 × 4 of type dbl\n",
"\n",
"\t | Estimate | Std. Error | t value | Pr(>|t|) |
\n",
"\n",
"\n",
"\t(Intercept) | 1.90426882 | 0.6054585 | 3.145168 | 2.203831e-03 |
\n",
"\tpred | 0.03960392 | 0.1096484 | 0.361190 | 7.187429e-01 |
\n",
"\tmed | 0.63549459 | 0.1005339 | 6.321194 | 7.922642e-09 |
\n",
"\n",
"
\n",
" \n",
"\t- $`Mod3: M~X`
\n",
"\t\t\n",
"A matrix: 2 × 4 of type dbl\n",
"\n",
"\t | Estimate | Std. Error | t value | Pr(>|t|) |
\n",
"\n",
"\n",
"\t(Intercept) | 1.4995183 | 0.58919773 | 2.545017 | 1.248749e-02 |
\n",
"\tpred | 0.5610153 | 0.09448048 | 5.937897 | 4.391362e-08 |
\n",
"\n",
"
\n",
" \n",
"\t- $Indirect.Effect
\n",
"\t\t- 0.356522196728078
\n",
"\t- $SE
\n",
"\t\t- 0.0823778110411936
\n",
"\t- $z.value
\n",
"\t\t- 4.32789111803173
\n",
"\t- $N
\n",
"\t\t- 100
\n",
"
\n"
],
"text/latex": [
"\\begin{description}\n",
"\\item[\\$`Mod1: Y\\textasciitilde{}X`] A matrix: 2 × 4 of type dbl\n",
"\\begin{tabular}{r|llll}\n",
" & Estimate & Std. Error & t value & Pr(>\\textbar{}t\\textbar{})\\\\\n",
"\\hline\n",
"\t(Intercept) & 2.8572046 & 0.6932130 & 4.121684 & 7.875771e-05\\\\\n",
"\tpred & 0.3961261 & 0.1111598 & 3.563574 & 5.671128e-04\\\\\n",
"\\end{tabular}\n",
"\n",
"\\item[\\$`Mod2: Y\\textasciitilde{}X+M`] A matrix: 3 × 4 of type dbl\n",
"\\begin{tabular}{r|llll}\n",
" & Estimate & Std. Error & t value & Pr(>\\textbar{}t\\textbar{})\\\\\n",
"\\hline\n",
"\t(Intercept) & 1.90426882 & 0.6054585 & 3.145168 & 2.203831e-03\\\\\n",
"\tpred & 0.03960392 & 0.1096484 & 0.361190 & 7.187429e-01\\\\\n",
"\tmed & 0.63549459 & 0.1005339 & 6.321194 & 7.922642e-09\\\\\n",
"\\end{tabular}\n",
"\n",
"\\item[\\$`Mod3: M\\textasciitilde{}X`] A matrix: 2 × 4 of type dbl\n",
"\\begin{tabular}{r|llll}\n",
" & Estimate & Std. Error & t value & Pr(>\\textbar{}t\\textbar{})\\\\\n",
"\\hline\n",
"\t(Intercept) & 1.4995183 & 0.58919773 & 2.545017 & 1.248749e-02\\\\\n",
"\tpred & 0.5610153 & 0.09448048 & 5.937897 & 4.391362e-08\\\\\n",
"\\end{tabular}\n",
"\n",
"\\item[\\$Indirect.Effect] 0.356522196728078\n",
"\\item[\\$SE] 0.0823778110411936\n",
"\\item[\\$z.value] 4.32789111803173\n",
"\\item[\\$N] 100\n",
"\\end{description}\n"
],
"text/markdown": [
"$`Mod1: Y~X`\n",
": \n",
"A matrix: 2 × 4 of type dbl\n",
"\n",
"| | Estimate | Std. Error | t value | Pr(>|t|) |\n",
"|---|---|---|---|---|\n",
"| (Intercept) | 2.8572046 | 0.6932130 | 4.121684 | 7.875771e-05 |\n",
"| pred | 0.3961261 | 0.1111598 | 3.563574 | 5.671128e-04 |\n",
"\n",
"\n",
"$`Mod2: Y~X+M`\n",
": \n",
"A matrix: 3 × 4 of type dbl\n",
"\n",
"| | Estimate | Std. Error | t value | Pr(>|t|) |\n",
"|---|---|---|---|---|\n",
"| (Intercept) | 1.90426882 | 0.6054585 | 3.145168 | 2.203831e-03 |\n",
"| pred | 0.03960392 | 0.1096484 | 0.361190 | 7.187429e-01 |\n",
"| med | 0.63549459 | 0.1005339 | 6.321194 | 7.922642e-09 |\n",
"\n",
"\n",
"$`Mod3: M~X`\n",
": \n",
"A matrix: 2 × 4 of type dbl\n",
"\n",
"| | Estimate | Std. Error | t value | Pr(>|t|) |\n",
"|---|---|---|---|---|\n",
"| (Intercept) | 1.4995183 | 0.58919773 | 2.545017 | 1.248749e-02 |\n",
"| pred | 0.5610153 | 0.09448048 | 5.937897 | 4.391362e-08 |\n",
"\n",
"\n",
"$Indirect.Effect\n",
": 0.356522196728078\n",
"$SE\n",
": 0.0823778110411936\n",
"$z.value\n",
": 4.32789111803173\n",
"$N\n",
": 100\n",
"\n",
"\n"
],
"text/plain": [
"$`Mod1: Y~X`\n",
" Estimate Std. Error t value Pr(>|t|)\n",
"(Intercept) 2.8572046 0.6932130 4.121684 7.875771e-05\n",
"pred 0.3961261 0.1111598 3.563574 5.671128e-04\n",
"\n",
"$`Mod2: Y~X+M`\n",
" Estimate Std. Error t value Pr(>|t|)\n",
"(Intercept) 1.90426882 0.6054585 3.145168 2.203831e-03\n",
"pred 0.03960392 0.1096484 0.361190 7.187429e-01\n",
"med 0.63549459 0.1005339 6.321194 7.922642e-09\n",
"\n",
"$`Mod3: M~X`\n",
" Estimate Std. Error t value Pr(>|t|)\n",
"(Intercept) 1.4995183 0.58919773 2.545017 1.248749e-02\n",
"pred 0.5610153 0.09448048 5.937897 4.391362e-08\n",
"\n",
"$Indirect.Effect\n",
"[1] 0.3565222\n",
"\n",
"$SE\n",
"[1] 0.08237781\n",
"\n",
"$z.value\n",
"[1] 4.327891\n",
"\n",
"$N\n",
"[1] 100\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 使用函数\n",
"# library(multilevel)\n",
"sobel(myData$X, myData$M, myData$Y)"
]
},
{
"cell_type": "markdown",
"id": "7190cd84",
"metadata": {},
"source": [
"## 使用mediation"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "d8a3ecf4",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Running nonparametric bootstrap\n",
"\n",
"\n"
]
},
{
"data": {
"text/plain": [
"\n",
"Causal Mediation Analysis \n",
"\n",
"Nonparametric Bootstrap Confidence Intervals with the Percentile Method\n",
"\n",
" Estimate 95% CI Lower 95% CI Upper p-value \n",
"ACME 0.3565 0.2142 0.53 <2e-16 ***\n",
"ADE 0.0396 -0.1984 0.29 0.752 \n",
"Total Effect 0.3961 0.1602 0.63 0.004 ** \n",
"Prop. Mediated 0.9000 0.4927 2.11 0.004 ** \n",
"---\n",
"Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1\n",
"\n",
"Sample Size Used: 100 \n",
"\n",
"\n",
"Simulations: 1000 \n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"res.1 = mediate(model.XM, model.MY.XY, treat='X', mediator='M', \n",
" boot=TRUE, sims=1000)\n",
"summary(res.1)"
]
},
{
"cell_type": "markdown",
"id": "70beab0d",
"metadata": {},
"source": [
"## 使用lavaan"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "6fa64c3f",
"metadata": {},
"outputs": [],
"source": [
"# Step 1: Specify mediation model\n",
"# The lavaan syntax\n",
"model = \"\n",
"# Path c' (direct effect)\n",
"Y ~ c*X\n",
"# Path a\n",
"M ~ a*X\n",
"# Path b\n",
"Y ~ b*M\n",
"# Indirect effect (a*b)\n",
"ab := a*b\n",
"\""
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "f1f567a6",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\t- $header
\n",
"\t\t\n",
"\t- $lavaan.version
\n",
"\t\t- '0.6.17'
\n",
"\t- $sam.approach
\n",
"\t\t- FALSE
\n",
"\t- $optim.method
\n",
"\t\t- 'nlminb'
\n",
"\t- $optim.iterations
\n",
"\t\t- 1
\n",
"\t- $optim.converged
\n",
"\t\t- TRUE
\n",
"
\n",
" \n",
"\t- $optim
\n",
"\t\t\n",
"\t- $estimator
\n",
"\t\t- 'ML'
\n",
"\t- $estimator.args
\n",
"\t\t\n",
"
\n",
" \n",
"\t- $optim.method
\n",
"\t\t- 'nlminb'
\n",
"\t- $npar
\n",
"\t\t- 5
\n",
"\t- $eq.constraints
\n",
"\t\t- FALSE
\n",
"\t- $nrow.ceq.jac
\n",
"\t\t- 0
\n",
"\t- $nrow.cin.jac
\n",
"\t\t- 0
\n",
"\t- $nrow.con.jac
\n",
"\t\t- 0
\n",
"\t- $con.jac.rank
\n",
"\t\t- 0
\n",
"
\n",
" \n",
"\t- $data
\n",
"\t\t\n",
"\t- $ngroups
\n",
"\t\t- 1
\n",
"\t- $nobs
\n",
"\t\t- 100
\n",
"
\n",
" \n",
"\t- $test
\n",
"\t\t- $standard =
\n",
"\t- $test
\n",
"\t\t- 'standard'
\n",
"\t- $stat
\n",
"\t\t- 8.88178419700125e-14
\n",
"\t- $stat.group
\n",
"\t\t- 8.88178419700125e-14
\n",
"\t- $df
\n",
"\t\t- 0
\n",
"\t- $refdistr
\n",
"\t\t- 'chisq'
\n",
"\t- $pvalue
\n",
"\t\t- <NA>
\n",
"
\n",
" \n",
"\t- $fit
\n",
"\t\t- npar
- 5
- fmin
- 4.44089209850063e-16
- chisq
- 8.88178419700125e-14
- df
- 0
- pvalue
- <NA>
- baseline.chisq
- 77.4131764309656
- baseline.df
- 3
- baseline.pvalue
- 1.11022302462516e-16
- cfi
- 0.999999999999999
- tli
- 1
- logl
- -379.612296327384
- unrestricted.logl
- -379.612296327384
- aic
- 769.224592654767
- bic
- 782.250443584708
- ntotal
- 100
- bic2
- 766.459187569449
- rmsea
- 0
- rmsea.ci.lower
- 0
- rmsea.ci.upper
- 0
- rmsea.ci.level
- 0.9
- rmsea.pvalue
- <NA>
- rmsea.close.h0
- 0.05
- rmsea.notclose.pvalue
- <NA>
- rmsea.notclose.h0
- 0.08
- srmr
- 0
\n",
" \n",
"\t- $pe
\n",
"\t\t\n",
"A data.frame: 9 × 9\n",
"\n",
"\tlhs | op | rhs | label | exo | est | se | z | pvalue |
\n",
"\t<chr> | <chr> | <chr> | <chr> | <int> | <dbl> | <dbl> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\tY | ~ | X | c | 0 | 0.03960392 | 0.10799119 | 0.3667329 | 7.138183e-01 |
\n",
"\tM | ~ | X | a | 0 | 0.56101532 | 0.09353090 | 5.9981813 | 1.995397e-09 |
\n",
"\tY | ~ | M | b | 0 | 0.63549459 | 0.09901445 | 6.4182005 | 1.378946e-10 |
\n",
"\tY | ~~ | Y | | 0 | 2.58142482 | 0.36506860 | 7.0710678 | 1.537437e-12 |
\n",
"\tM | ~~ | M | | 0 | 2.63306954 | 0.37237227 | 7.0710678 | 1.537437e-12 |
\n",
"\tX | ~~ | X | | 1 | 3.00990000 | 0.00000000 | NA | NA |
\n",
"\tab | := | a*b | ab | 0 | 0.35652220 | 0.08135460 | 4.3823238 | 1.174201e-05 |
\n",
"\tY | r2 | Y | | 0 | 0.37299924 | NA | NA | NA |
\n",
"\tM | r2 | M | | 0 | 0.26458788 | NA | NA | NA |
\n",
"\n",
"
\n",
" \n",
"
\n"
],
"text/latex": [
"\\begin{description}\n",
"\\item[\\$header] \\begin{description}\n",
"\\item[\\$lavaan.version] '0.6.17'\n",
"\\item[\\$sam.approach] FALSE\n",
"\\item[\\$optim.method] 'nlminb'\n",
"\\item[\\$optim.iterations] 1\n",
"\\item[\\$optim.converged] TRUE\n",
"\\end{description}\n",
"\n",
"\\item[\\$optim] \\begin{description}\n",
"\\item[\\$estimator] 'ML'\n",
"\\item[\\$estimator.args] \\begin{enumerate}\n",
"\\end{enumerate}\n",
"\n",
"\\item[\\$optim.method] 'nlminb'\n",
"\\item[\\$npar] 5\n",
"\\item[\\$eq.constraints] FALSE\n",
"\\item[\\$nrow.ceq.jac] 0\n",
"\\item[\\$nrow.cin.jac] 0\n",
"\\item[\\$nrow.con.jac] 0\n",
"\\item[\\$con.jac.rank] 0\n",
"\\end{description}\n",
"\n",
"\\item[\\$data] \\begin{description}\n",
"\\item[\\$ngroups] 1\n",
"\\item[\\$nobs] 100\n",
"\\end{description}\n",
"\n",
"\\item[\\$test] \\textbf{\\$standard} = \\begin{description}\n",
"\\item[\\$test] 'standard'\n",
"\\item[\\$stat] 8.88178419700125e-14\n",
"\\item[\\$stat.group] 8.88178419700125e-14\n",
"\\item[\\$df] 0\n",
"\\item[\\$refdistr] 'chisq'\n",
"\\item[\\$pvalue] \n",
"\\end{description}\n",
"\n",
"\\item[\\$fit] \\begin{description*}\n",
"\\item[npar] 5\n",
"\\item[fmin] 4.44089209850063e-16\n",
"\\item[chisq] 8.88178419700125e-14\n",
"\\item[df] 0\n",
"\\item[pvalue] \n",
"\\item[baseline.chisq] 77.4131764309656\n",
"\\item[baseline.df] 3\n",
"\\item[baseline.pvalue] 1.11022302462516e-16\n",
"\\item[cfi] 0.999999999999999\n",
"\\item[tli] 1\n",
"\\item[logl] -379.612296327384\n",
"\\item[unrestricted.logl] -379.612296327384\n",
"\\item[aic] 769.224592654767\n",
"\\item[bic] 782.250443584708\n",
"\\item[ntotal] 100\n",
"\\item[bic2] 766.459187569449\n",
"\\item[rmsea] 0\n",
"\\item[rmsea.ci.lower] 0\n",
"\\item[rmsea.ci.upper] 0\n",
"\\item[rmsea.ci.level] 0.9\n",
"\\item[rmsea.pvalue] \n",
"\\item[rmsea.close.h0] 0.05\n",
"\\item[rmsea.notclose.pvalue] \n",
"\\item[rmsea.notclose.h0] 0.08\n",
"\\item[srmr] 0\n",
"\\end{description*}\n",
"\n",
"\\item[\\$pe] A data.frame: 9 × 9\n",
"\\begin{tabular}{lllllllll}\n",
" lhs & op & rhs & label & exo & est & se & z & pvalue\\\\\n",
" & & & & & & & & \\\\\n",
"\\hline\n",
"\t Y & \\textasciitilde{} & X & c & 0 & 0.03960392 & 0.10799119 & 0.3667329 & 7.138183e-01\\\\\n",
"\t M & \\textasciitilde{} & X & a & 0 & 0.56101532 & 0.09353090 & 5.9981813 & 1.995397e-09\\\\\n",
"\t Y & \\textasciitilde{} & M & b & 0 & 0.63549459 & 0.09901445 & 6.4182005 & 1.378946e-10\\\\\n",
"\t Y & \\textasciitilde{}\\textasciitilde{} & Y & & 0 & 2.58142482 & 0.36506860 & 7.0710678 & 1.537437e-12\\\\\n",
"\t M & \\textasciitilde{}\\textasciitilde{} & M & & 0 & 2.63306954 & 0.37237227 & 7.0710678 & 1.537437e-12\\\\\n",
"\t X & \\textasciitilde{}\\textasciitilde{} & X & & 1 & 3.00990000 & 0.00000000 & NA & NA\\\\\n",
"\t ab & := & a*b & ab & 0 & 0.35652220 & 0.08135460 & 4.3823238 & 1.174201e-05\\\\\n",
"\t Y & r2 & Y & & 0 & 0.37299924 & NA & NA & NA\\\\\n",
"\t M & r2 & M & & 0 & 0.26458788 & NA & NA & NA\\\\\n",
"\\end{tabular}\n",
"\n",
"\\end{description}\n"
],
"text/markdown": [
"$header\n",
": $lavaan.version\n",
": '0.6.17'\n",
"$sam.approach\n",
": FALSE\n",
"$optim.method\n",
": 'nlminb'\n",
"$optim.iterations\n",
": 1\n",
"$optim.converged\n",
": TRUE\n",
"\n",
"\n",
"\n",
"$optim\n",
": $estimator\n",
": 'ML'\n",
"$estimator.args\n",
": \n",
"\n",
"\n",
"$optim.method\n",
": 'nlminb'\n",
"$npar\n",
": 5\n",
"$eq.constraints\n",
": FALSE\n",
"$nrow.ceq.jac\n",
": 0\n",
"$nrow.cin.jac\n",
": 0\n",
"$nrow.con.jac\n",
": 0\n",
"$con.jac.rank\n",
": 0\n",
"\n",
"\n",
"\n",
"$data\n",
": $ngroups\n",
": 1\n",
"$nobs\n",
": 100\n",
"\n",
"\n",
"\n",
"$test\n",
": **$standard** = $test\n",
": 'standard'\n",
"$stat\n",
": 8.88178419700125e-14\n",
"$stat.group\n",
": 8.88178419700125e-14\n",
"$df\n",
": 0\n",
"$refdistr\n",
": 'chisq'\n",
"$pvalue\n",
": <NA>\n",
"\n",
"\n",
"\n",
"$fit\n",
": npar\n",
": 5fmin\n",
": 4.44089209850063e-16chisq\n",
": 8.88178419700125e-14df\n",
": 0pvalue\n",
": <NA>baseline.chisq\n",
": 77.4131764309656baseline.df\n",
": 3baseline.pvalue\n",
": 1.11022302462516e-16cfi\n",
": 0.999999999999999tli\n",
": 1logl\n",
": -379.612296327384unrestricted.logl\n",
": -379.612296327384aic\n",
": 769.224592654767bic\n",
": 782.250443584708ntotal\n",
": 100bic2\n",
": 766.459187569449rmsea\n",
": 0rmsea.ci.lower\n",
": 0rmsea.ci.upper\n",
": 0rmsea.ci.level\n",
": 0.9rmsea.pvalue\n",
": <NA>rmsea.close.h0\n",
": 0.05rmsea.notclose.pvalue\n",
": <NA>rmsea.notclose.h0\n",
": 0.08srmr\n",
": 0\n",
"\n",
"\n",
"$pe\n",
": \n",
"A data.frame: 9 × 9\n",
"\n",
"| lhs <chr> | op <chr> | rhs <chr> | label <chr> | exo <int> | est <dbl> | se <dbl> | z <dbl> | pvalue <dbl> |\n",
"|---|---|---|---|---|---|---|---|---|\n",
"| Y | ~ | X | c | 0 | 0.03960392 | 0.10799119 | 0.3667329 | 7.138183e-01 |\n",
"| M | ~ | X | a | 0 | 0.56101532 | 0.09353090 | 5.9981813 | 1.995397e-09 |\n",
"| Y | ~ | M | b | 0 | 0.63549459 | 0.09901445 | 6.4182005 | 1.378946e-10 |\n",
"| Y | ~~ | Y | | 0 | 2.58142482 | 0.36506860 | 7.0710678 | 1.537437e-12 |\n",
"| M | ~~ | M | | 0 | 2.63306954 | 0.37237227 | 7.0710678 | 1.537437e-12 |\n",
"| X | ~~ | X | | 1 | 3.00990000 | 0.00000000 | NA | NA |\n",
"| ab | := | a*b | ab | 0 | 0.35652220 | 0.08135460 | 4.3823238 | 1.174201e-05 |\n",
"| Y | r2 | Y | | 0 | 0.37299924 | NA | NA | NA |\n",
"| M | r2 | M | | 0 | 0.26458788 | NA | NA | NA |\n",
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
"lavaan 0.6.17 ended normally after 1 iteration\n",
"\n",
" Estimator ML\n",
" Optimization method NLMINB\n",
" Number of model parameters 5\n",
"\n",
" Number of observations 100\n",
"\n",
"Model Test User Model:\n",
" \n",
" Test statistic 0.000\n",
" Degrees of freedom 0\n",
"\n",
"Model Test Baseline Model:\n",
"\n",
" Test statistic 77.413\n",
" Degrees of freedom 3\n",
" P-value 0.000\n",
"\n",
"User Model versus Baseline Model:\n",
"\n",
" Comparative Fit Index (CFI) 1.000\n",
" Tucker-Lewis Index (TLI) 1.000\n",
"\n",
"Loglikelihood and Information Criteria:\n",
"\n",
" Loglikelihood user model (H0) -379.612\n",
" Loglikelihood unrestricted model (H1) -379.612\n",
" \n",
" Akaike (AIC) 769.225\n",
" Bayesian (BIC) 782.250\n",
" Sample-size adjusted Bayesian (SABIC) 766.459\n",
"\n",
"Root Mean Square Error of Approximation:\n",
"\n",
" RMSEA 0.000\n",
" 90 Percent confidence interval - lower 0.000\n",
" 90 Percent confidence interval - upper 0.000\n",
" P-value H_0: RMSEA <= 0.050 NA\n",
" P-value H_0: RMSEA >= 0.080 NA\n",
"\n",
"Standardized Root Mean Square Residual:\n",
"\n",
" SRMR 0.000\n",
"\n",
"Parameter Estimates:\n",
"\n",
" Standard errors Standard\n",
" Information Expected\n",
" Information saturated (h1) model Structured\n",
"\n",
"Regressions:\n",
" Estimate Std.Err z-value P(>|z|)\n",
" Y ~ \n",
" X (c) 0.040 0.108 0.367 0.714\n",
" M ~ \n",
" X (a) 0.561 0.094 5.998 0.000\n",
" Y ~ \n",
" M (b) 0.635 0.099 6.418 0.000\n",
"\n",
"Variances:\n",
" Estimate Std.Err z-value P(>|z|)\n",
" .Y 2.581 0.365 7.071 0.000\n",
" .M 2.633 0.372 7.071 0.000\n",
"\n",
"R-Square:\n",
" Estimate\n",
" Y 0.373\n",
" M 0.265\n",
"\n",
"Defined Parameters:\n",
" Estimate Std.Err z-value P(>|z|)\n",
" ab 0.357 0.081 4.382 0.000\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Step 2: Estimate model - delta method (by default)\n",
"fitmod = sem(model, data=myData)\n",
"# Step 3: Request summary\n",
"summary(fitmod, fit.measures=TRUE, rsquare=TRUE)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "50b59da3",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"A lavaan.data.frame: 7 × 10\n",
"\n",
"\tlhs | op | rhs | label | est | se | z | pvalue | ci.lower | ci.upper |
\n",
"\t<chr> | <chr> | <chr> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> |
\n",
"\n",
"\n",
"\tY | ~ | X | c | 0.03960392 | 0.12755884 | 0.3104757 | 7.561992e-01 | -0.2000781 | 0.2901507 |
\n",
"\tM | ~ | X | a | 0.56101532 | 0.09658860 | 5.8082973 | 6.311139e-09 | 0.3874452 | 0.7691867 |
\n",
"\tY | ~ | M | b | 0.63549459 | 0.10507922 | 6.0477665 | 1.468676e-09 | 0.4311823 | 0.8426629 |
\n",
"\tY | ~~ | Y | | 2.58142482 | 0.32884071 | 7.8500767 | 4.218847e-15 | 1.9048312 | 3.1598721 |
\n",
"\tM | ~~ | M | | 2.63306954 | 0.34658373 | 7.5972104 | 3.019807e-14 | 1.9150087 | 3.3124284 |
\n",
"\tX | ~~ | X | | 3.00990000 | 0.00000000 | NA | NA | 3.0099000 | 3.0099000 |
\n",
"\tab | := | a*b | ab | 0.35652220 | 0.08216977 | 4.3388485 | 1.432312e-05 | 0.2168658 | 0.5321631 |
\n",
"\n",
"
\n"
],
"text/latex": [
"A lavaan.data.frame: 7 × 10\n",
"\\begin{tabular}{llllllllll}\n",
" lhs & op & rhs & label & est & se & z & pvalue & ci.lower & ci.upper\\\\\n",
" & & & & & & & & & \\\\\n",
"\\hline\n",
"\t Y & \\textasciitilde{} & X & c & 0.03960392 & 0.12755884 & 0.3104757 & 7.561992e-01 & -0.2000781 & 0.2901507\\\\\n",
"\t M & \\textasciitilde{} & X & a & 0.56101532 & 0.09658860 & 5.8082973 & 6.311139e-09 & 0.3874452 & 0.7691867\\\\\n",
"\t Y & \\textasciitilde{} & M & b & 0.63549459 & 0.10507922 & 6.0477665 & 1.468676e-09 & 0.4311823 & 0.8426629\\\\\n",
"\t Y & \\textasciitilde{}\\textasciitilde{} & Y & & 2.58142482 & 0.32884071 & 7.8500767 & 4.218847e-15 & 1.9048312 & 3.1598721\\\\\n",
"\t M & \\textasciitilde{}\\textasciitilde{} & M & & 2.63306954 & 0.34658373 & 7.5972104 & 3.019807e-14 & 1.9150087 & 3.3124284\\\\\n",
"\t X & \\textasciitilde{}\\textasciitilde{} & X & & 3.00990000 & 0.00000000 & NA & NA & 3.0099000 & 3.0099000\\\\\n",
"\t ab & := & a*b & ab & 0.35652220 & 0.08216977 & 4.3388485 & 1.432312e-05 & 0.2168658 & 0.5321631\\\\\n",
"\\end{tabular}\n"
],
"text/markdown": [
"\n",
"A lavaan.data.frame: 7 × 10\n",
"\n",
"| lhs <chr> | op <chr> | rhs <chr> | label <chr> | est <dbl> | se <dbl> | z <dbl> | pvalue <dbl> | ci.lower <dbl> | ci.upper <dbl> |\n",
"|---|---|---|---|---|---|---|---|---|---|\n",
"| Y | ~ | X | c | 0.03960392 | 0.12755884 | 0.3104757 | 7.561992e-01 | -0.2000781 | 0.2901507 |\n",
"| M | ~ | X | a | 0.56101532 | 0.09658860 | 5.8082973 | 6.311139e-09 | 0.3874452 | 0.7691867 |\n",
"| Y | ~ | M | b | 0.63549459 | 0.10507922 | 6.0477665 | 1.468676e-09 | 0.4311823 | 0.8426629 |\n",
"| Y | ~~ | Y | | 2.58142482 | 0.32884071 | 7.8500767 | 4.218847e-15 | 1.9048312 | 3.1598721 |\n",
"| M | ~~ | M | | 2.63306954 | 0.34658373 | 7.5972104 | 3.019807e-14 | 1.9150087 | 3.3124284 |\n",
"| X | ~~ | X | | 3.00990000 | 0.00000000 | NA | NA | 3.0099000 | 3.0099000 |\n",
"| ab | := | a*b | ab | 0.35652220 | 0.08216977 | 4.3388485 | 1.432312e-05 | 0.2168658 | 0.5321631 |\n",
"\n"
],
"text/plain": [
" lhs op rhs label est se z pvalue ci.lower \n",
"1 Y ~ X c 0.03960392 0.12755884 0.3104757 7.561992e-01 -0.2000781\n",
"2 M ~ X a 0.56101532 0.09658860 5.8082973 6.311139e-09 0.3874452\n",
"3 Y ~ M b 0.63549459 0.10507922 6.0477665 1.468676e-09 0.4311823\n",
"4 Y ~~ Y 2.58142482 0.32884071 7.8500767 4.218847e-15 1.9048312\n",
"5 M ~~ M 2.63306954 0.34658373 7.5972104 3.019807e-14 1.9150087\n",
"6 X ~~ X 3.00990000 0.00000000 NA NA 3.0099000\n",
"7 ab := a*b ab 0.35652220 0.08216977 4.3388485 1.432312e-05 0.2168658\n",
" ci.upper \n",
"1 0.2901507\n",
"2 0.7691867\n",
"3 0.8426629\n",
"4 3.1598721\n",
"5 3.3124284\n",
"6 3.0099000\n",
"7 0.5321631"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Step 2: Estimate model - percentile bootstrapping method\n",
"fitmod2 = sem(model, data=myData, se=\"bootstrap\", bootstrap=1000)\n",
"# Ste[pRequest percentile bootstrap 95% confidence intervals\n",
"parameterEstimates(fitmod2, ci=TRUE, level=0.95, boot.ci.type=\"perc\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "4.2.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}