{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "title: 结构方程模型R语言实战教程\n", "date: 2024-02-28 12:44:03\n", "tags: [结构方程, R, mplus, amos]\n", "mathjax: true\n", "---\n", "\n", "SEMinR 为创建和估计结构方程模型 (SEM) 非常容易的使用方法。 SEMinR 集成了 SmartPLS 具有的偏最小二乘路径建模 (PLS-PM) 进行估计,也可以使用 LISREL 和 AMOS 的基于协方差的结构方程模型 (CBSEM) 进行估计, 还支持反应性测量模型的验证性因素分析 (CFA)。SEMinR 中 CBSEM 和 CFA 估计都使用 Lavaan 软件包。\n", "\n", "\n", "\n", "SEMinR 有如下特点:\n", "- 使用一种通俗易懂语言,用于在 R 中构建和估计结构方程模型\n", "- 可以使用基于方差的 PLS 估计和基于协方差的 SEM 估计来对潜变量结构进行建模 \n", "- 高级函数可快速指定交互作用、高阶结构 和结构路径\n", "\n", "SEMinR 使用自己的 PLS-PM 估计引擎,并与 Lavaan 软件包集成以进行 CBSEM/CFA 估计。 它还带来了其他软件包或软件中没有的一些方法。\n", "\n", "## 安装\n", "\n", "使用如下代码安装 SEMinR , 它是R的包, 所以你需要在R中运行如下代码:\n", "\n", "```R\n", "install.packages(\"seminr\")\n", "```\n", "\n", "注意seminr是使用R4.3.3编译的, 你的R版本不能低于这个版本.\n", "\n", "然后加载包:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "library(seminr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数据\n", "\n", "你需要从任何数据文件中加载数据到数据框(data.frame)。 列名必须是测量项目的名称。 重要提示:避免在列名称中使用星号“*”(这些是为交互术语保留的)。\n", "\n", "我们的教程使用的是 seminr 自带的数据集 mobi, 可以使用data方法加载数据, 如下:\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [ { "data": { "text/html": [ "
CUEX1 | CUEX2 | CUEX3 | CUSA1 | CUSA2 | CUSA3 | CUSCO | CUSL1 | CUSL2 | CUSL3 | ⋯ | IMAG5 | PERQ1 | PERQ2 | PERQ3 | PERQ4 | PERQ5 | PERQ6 | PERQ7 | PERV1 | PERV2 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | ⋯ | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | |
1 | 7 | 7 | 6 | 6 | 4 | 7 | 7 | 6 | 5 | 6 | ⋯ | 4 | 7 | 6 | 4 | 7 | 6 | 5 | 5 | 2 | 3 |
2 | 10 | 10 | 9 | 10 | 10 | 8 | 10 | 10 | 2 | 10 | ⋯ | 9 | 10 | 9 | 10 | 10 | 9 | 10 | 10 | 10 | 10 |
3 | 7 | 7 | 7 | 8 | 7 | 7 | 6 | 6 | 2 | 7 | ⋯ | 7 | 7 | 8 | 5 | 7 | 8 | 7 | 7 | 7 | 7 |
4 | 7 | 10 | 5 | 10 | 10 | 10 | 5 | 10 | 4 | 10 | ⋯ | 10 | 8 | 10 | 10 | 8 | 4 | 5 | 8 | 5 | 5 |
5 | 8 | 7 | 10 | 10 | 8 | 8 | 5 | 10 | 3 | 8 | ⋯ | 9 | 10 | 9 | 8 | 10 | 9 | 9 | 8 | 6 | 6 |
6 | 10 | 9 | 7 | 8 | 7 | 7 | 8 | 10 | 3 | 10 | ⋯ | 9 | 9 | 10 | 9 | 10 | 8 | 9 | 9 | 10 | 10 |
structure(function (data, measurement_model, structural_model, \n",
" ints, ...) \n",
"{\n",
" interaction_name <- paste(iv, moderator, sep = \"*\")\n",
" iv1_items <- measurement_model[measurement_model[, \"construct\"] == \n",
" iv, \"measurement\"]\n",
" iv2_items <- measurement_model[measurement_model[, \"construct\"] == \n",
" moderator, \"measurement\"]\n",
" iv1_data <- as.data.frame(scale(data[iv1_items]))\n",
" iv2_data <- as.data.frame(scale(data[iv2_items]))\n",
" multiples_list <- lapply(iv1_data, mult, iv2_data)\n",
" interaction_data <- do.call(\"cbind\", multiples_list)\n",
" colnames(interaction_data) <- as.vector(sapply(iv1_items, \n",
" name_items, iv2_items))\n",
" intxn_mm <- matrix(measure_interaction(interaction_name, \n",
" interaction_data, weights), ncol = 3, byrow = TRUE)\n",
" return(list(name = interaction_name, data = interaction_data, \n",
" mm = intxn_mm))\n",
"}, class = c(\"function\", \"interaction\", \"scaled_interaction\"))