R 语言用于统计计算与数据可视化的示意图

R语言介绍#

R语言是一种专门用于统计计算和图形展示的编程语言。它由Ross Ihaka和Robert Gentleman于1993年开发,广泛应用于数据分析、统计建模和数据可视化领域。R语言的特点包括:

  • 开源免费:R语言是开源的,用户可以免费使用和修改。
  • 强大的统计功能:R语言内置了大量的统计函数和包,支持从基础统计到高级机器学习算法的实现。
  • 丰富的图形功能:R语言提供了强大的图形系统(如 ggplot2),可以生成高质量的统计图表。
  • 活跃的社区支持:R语言拥有庞大的用户社区,用户可以轻松找到相关的教程、文档和扩展包。

常用的分析模块#

一篇标准的统计分析文章通常包含以下几个部分:

  1. 数据描述:对数据集的基本信息进行描述,包括样本量、变量类型等。
  2. 描述性统计分析:对数据进行初步分析,如计算均值、标准差、频率分布等。
  3. 假设检验:根据研究问题提出假设,并进行统计检验(如t检验、卡方检验等)。
  4. 回归分析:探索变量之间的关系,如线性回归、逻辑回归等。
  5. 模型评估:对统计模型的拟合效果进行评估,如R²、AIC等指标。
  6. 结果可视化:通过图表展示分析结果,如散点图、箱线图等。

描述性统计分析#

bruceR是一个R语言包,提供了许多便捷的统计分析函数,其中 Describe函数可以快速生成描述性统计结果。以下是使用步骤:

  1. 安装并加载 bruceR包:

    install.packages("bruceR")
    library(bruceR)
  2. 加载数据:

    data <- read.csv("your_data.csv") # 替换为你的数据文件路径
  3. 使用 Describe函数:

    Describe(data)

    该函数会输出每个变量的描述性统计信息,包括均值、标准差、最小值、最大值等。 Describe函数的常用参数包括:

    • digits:控制输出结果的小数位数。例如,digits = 2表示保留两位小数。
    • na.rm:是否忽略缺失值,默认为 TRUE。
    • trim:用于计算截尾均值,默认为 0(不截尾)。
    • check:是否检查数据的有效性,默认为 TRUE。

    示例:

    Describe(data, digits = 2) # 保留两位小数

探索性因子分析#

探索性因子分析一般用来检验题项与因子之间的对应关系,但假若使用经典量表,一般也不报告这部分分析的内容,而是使用验证性因子分析CFA。共同方法偏差的分析一般也可以报告这部分的结果。

探索性因子分析(EFA)用于检验题项与因子之间的对应关系。以下是使用 bruceR包的 EFA函数的步骤:

  1. 安装并加载 bruceR包:

    install.packages("bruceR")
    library(bruceR)
  2. 加载数据:

    data <- read.csv("your_data.csv") # 替换为你的数据文件路径
  3. 使用 EFA函数:

    EFA(data, nfactors = 3) # nfactors指定因子数量

    该函数会输出因子载荷矩阵、特征值、解释方差等结果。

验证性因子分析#

当使用经典量表的时候,这时需要验证量表的有效性,我的理解是这时候经典量表是否适合你的研究模型,或者理解为本地化是否成功。 具体的一些检验指标的概念,大家可以去spssau上面搜索了解,这个平台的帮助手册我觉得十分不错。

如何开始嘞,这时一般需要跑几个cfa模型,常见的有以你模型为结构标准的基准模型,一因子,二因子,我看见的也有继续做三因子,四因子的,这里做到多少个因子,我的看法是比你基准模型的因子少就行,或者只做到二因子。因为国人常用一个更骚的方法,叫biafactor,双因子模型,似乎也叫ulmc,就是在基准模型上面加一个全局的方法因子来检验共同方法偏差的存在。

首先,我们来看基准模型可以报告哪些指标。

# 生成CFA结果的辅助函数
generate_cfa_result <- function(label, fit) {
#显示总体结果
# summary(bifactorfit,fit.measures="TRUE")
#显示所有拟合指数
# fitMeasures(bifactorfit,fit.measures="all",baseline.model=NULL)
tibble(
ID = label,
Chisq = fitMeasures(fit, "chisq"),
df = fitMeasures(fit, "df"),
`Chisq/df` = Chisq / df,
NFI = fitMeasures(fit, "nfi"),
CFI = fitMeasures(fit, "cfi"),
IFI = fitMeasures(fit, "ifi"),
TLI = fitMeasures(fit, "tli"),
GFI = fitMeasures(fit, "gfi"),
RMSEA = fitMeasures(fit, "rmsea"),
SRMR = fitMeasures(fit, 'srmr'),
)
}

常用指标:

  • Chisq/df: 严格[1, 3],宽松[1, 5]
  • CFI:比较拟合指数,>0.9表示良好拟合。
  • TLI:Tucker-Lewis指数,>0.9表示良好拟合。
  • RMSEA:近似误差均方根,<0.08表示良好拟合。
  • SRMR:标准化残差均方根,<0.08表示良好拟合。

以下是使用 lavaan包进行验证性因子分析(CFA)的示例:

  1. 安装并加载 lavaan包:

    install.packages("lavaan")
    library(lavaan)
  2. 定义模型:

    model <- '
    # 定义因子
    f1 =~ x1 + x2 + x3 # 自变量1
    f2 =~ x4 + x5 + x6 # 自变量2
    f3 =~ x7 + x8 + x9 # 中介变量
    f4 =~ x10 + x11 + x12 # 调节变量
    f5 =~ x13 + x14 + x15 # 因变量
    '
  3. 拟合模型:

    fit <- cfa(model, data = data)
    generate_cfa_result("基准模型", fit)

基准模型里面还有些可以报告的内容,如alpha,ave(区别效度会用到ave平方根),omega(组合信度?)等等,这些拟合指标可以通过semTools中函数,reliability(fit)。输出结果类似于这样

f1 f2 f3 f4
alpha 0.8852175 0.8853690 0.9030259 0.8903863
omega 0.8983741 0.8981945 0.9177765 0.9044974
omega2 0.8983741 0.8981945 0.9177765 0.9044974
omega3 0.8981426 0.8981986 0.9177723 0.9046049
avevar 0.7521083 0.7515437 0.7934002 0.7649806

只不过这个函数不再受支持了,官方文档建议使用compRelSEM,大家可以自行研究一下。 然后,其他一因子,二因子,三因子就是把所有题项想当然划分成两个因子,三个因子,这样模型的拟合肯定不好,不好就对了,才显得你基准模型的优秀不是。

将基准模型改为二因子模型:

model_1factor <- '
f1 =~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15
'
model_2factor <- '
f1 =~ x1 + x2 + x3 + x4 + x5 + x6 +x7 + x8 # 因子1
f2 =~ x9 + x10 + x11 + x12 + x13 + x14 + x15 # 因子2
'
# 三因子同理了
fit_1factor <- cfa(model_1factor, data = data)
fit_2factor <- cfa(model_2factor, data = data)
generate_cfa_result("一因子", fit_1factor)
generate_cfa_result("二因子", fit_2factor)

双因子模型的具体内容可以参考我的另外一篇文章,这个模型因为在基准模型上面加了一个全局方法因子,可能导致两种结果,一种是相较于基准模型变好了,另外一种是变坏了,变坏了可以突出你基准模型的优秀,可变好了怎么办嘞。其实,只要不好太多就行,依然表示你基准模型的优秀,但在这里好多少是多,我倒是没看见具体的标准。一般你基准模型的拟合指标过了,这个仅做参考吧,有谁知道可能评论区说说。

将基准模型改为双因子模型:

model_bifactor <- '
f1 =~ x1 + x2 + x3 # 自变量1
f2 =~ x4 + x5 + x6 # 自变量2
f3 =~ x7 + x8 + x9 # 中介变量
f4 =~ x10 + x11 + x12 # 调节变量
f5 =~ x13 + x14 + x15 # 因变量
g =~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 # 全局方法因子
'
fit_bifactor <- cfa(model_bifactor, data = data,orthogonal=TRUE)
# 进行CFA,必须加上orthogonal=TRUE,如果不加需要在model里面自己写正交关系
generate_cfa_result("biafactor",fit_bifactor)

路径检验#

路径检验,就是在验证性因子分析模型的基础上加入回归关系。仅仅是自变量到因变量的回归,别想太多,这里不要设计中介调节啥的。看你的概念模型里面,因子之间的箭头指向(因子之间,不涉及题项),一个箭头就是一个路径(主效应关系一般解释完了)。

在基准模型上添加回归关系路径:

model_path <- '
f1 =~ x1 + x2 + x3 # 自变量1
f2 =~ x4 + x5 + x6 # 自变量2
f3 =~ x7 + x8 + x9 # 中介变量
f4 =~ x10 + x11 + x12 # 调节变量
f5 =~ x13 + x14 + x15 # 因变量
# 添加回归关系
f5 ~ f1 + f2 + f3 + f4
f3 ~ f1 + f2
'
fit_path <- cfa(model_path, data = data)
generate_cfa_result("路径检验",fit_path)

路径检验的结果我们可能需要报告R^2,内生变量(有箭头指向自己的变量)都可以报告一个R^2,可以通过命令 R2 = lavInspect(fit_path, "rsquare")获取R^2

中介效应#

中介效应的分析就更加简单了,bruceR提供了十分友好的PROCESS函数。大家可以看官方文档,比较容易理解的。

PROCESS(
data,
y = "",
x = "",
meds = c(),
mods = c(),
covs = c(),
clusters = c(),
hlm.re.m = "",
hlm.re.y = "",
hlm.type = c("1-1-1", "2-1-1", "2-2-1"),
med.type = c("parallel", "serial"),
mod.type = c("2-way", "3-way"),
mod.path = c("x-y", "x-m", "m-y", "all"),
cov.path = c("y", "m", "both"),
mod1.val = NULL,
mod2.val = NULL,
ci = c("boot", "bc.boot", "bca.boot", "mcmc"),
nsim = 100,
seed = NULL,
center = TRUE,
std = FALSE,
digits = 3,
file = NULL
)

bruceR包的 PROCESS函数是一个强大的工具,用于分析中介效应和调节效应。以下是使用 PROCESS函数进行中介效应检验的示例:

# 安装并加载bruceR包
install.packages("bruceR")
library(bruceR)
# 定义变量
y <- "f5" # 因变量
x <- "f1" # 自变量
meds <- c("f3") # 中介变量
# 使用PROCESS函数进行中介效应检验
PROCESS(data, y = y, x = x, meds = meds, ci = "boot", nsim = 1000)

该函数会输出中介效应的估计值、置信区间以及显著性检验结果。我就不给输出结果了,结果挺易读,友好,大家自己动手跑就挺好。

平行中介#

平行中介是指多个中介变量同时作用于自变量和因变量之间的关系。以下是使用 PROCESS函数进行平行中介检验的示例:

# 定义变量
y <- "f5" # 因变量
x <- "f1" # 自变量
meds <- c("f3", "f4") # 中介变量
# 使用PROCESS函数进行平行中介检验
PROCESS(data, y = y, x = x, meds = meds, med.type = "parallel",ci = "boot", nsim = 1000)

链式中介#

链式中介是指中介变量之间存在顺序关系。以下是使用 PROCESS函数进行链式中介检验的示例:

# 定义变量
y <- "f5" # 因变量
x <- "f1" # 自变量
meds <- c("f2", "f3") # 中介变量
# 使用PROCESS函数进行链式中介检验
PROCESS(data, y = y, x = x, meds = meds, med.type = "serial", ci = "boot", nsim = 1000)

调节效应#

也是通过 bruceR::PROCESS函数。不得不说,这个函数真好用。 调节效应是指一个变量影响自变量和因变量之间的关系。以下是使用 PROCESS函数进行调节效应检验的示例:

# 定义变量
y <- "f5" # 因变量
x <- "f1" # 自变量
mods <- c("f4") # 调节变量
# 使用PROCESS函数进行调节效应检验
PROCESS(data, y = y, x = x, mods = mods, ci = "boot", nsim = 1000)

有调节的中介#

有调节的中介效应是指调节变量影响中介效应的强度或方向。以下是使用 PROCESS函数进行有调节的中介效应检验的示例:

# 定义变量
y <- "f5" # 因变量
x <- "f1" # 自变量
meds <- c("f3") # 中介变量
mods <- c("f4") # 调节变量
# 使用PROCESS函数进行有调节的中介效应检验
# 当同时有调节和中介的时候,需要指定调节变量指向的路径,x-y就是主效应的路径
# x-m就是自变量到中介变量的路径,m-y就是中介变量到因变量的路径。假设调节前面两条,那就组合
# x-y和x-m
# mod.path = c("x-y", "x-m", "m-y", "all"),
PROCESS(data, y = y, x = x, meds = meds, mods = mods, mod.path = c("x-y", "x-m"),ci = "boot", nsim = 1000)

总结#

以上是问卷分析的一个常规流程, 用R语言挺方便的,大家可以尝试一下。