![334929f123419bb16c6632e524a7a430.png](https://i-blog.csdnimg.cn/blog_migrate/fa8e2418d8c238667df41140a311732d.jpeg)
在上一篇文章中,我介绍了R中简单的数据操作,以及循环、判断语句。此外还涉及到了一些简单的统计分析,这部分内容没有展开论述。
张光耀:R语言数据处理与分析入门(a brief tutorial)zhuanlan.zhihu.com![1e9460668477188183abb08069bcbc50.png](https://i-blog.csdnimg.cn/blog_migrate/7045d44636ac24344a1bac5588da2de5.jpeg)
在这一篇文章中,我仍然“以任务为导向”,在完成任务的过程中讲解如何在R中进行一般线性模型的分析。
有人会问为什么为什么不从t检验和方差分析开始讲?答曰:这两者都是线性模型的特例,理解了线性模型就能理解t检验和方差分析,与其“舍本逐末”,不如“追本溯源”。
下面步入正题:
任务2-1:用Schad等人(2020)编写的函数MixedDesign() (available from OSF)来模拟2*3设计的实验的数据。实验中,在距离屏幕中央左或右一段水平距离的某处呈现刺激,要求被试按键反应并记录被试的反应时,水平距离有三个水平(1个、2个或3个单位)(假设每名被试只做一次反应,即是一个被试间设计的实验)。每个条件下有30次观测值,各条件的均值(标准差都为30)如下:
![90fb59aa527fcd49bd0cc67aff6be366.png](https://i-blog.csdnimg.cn/blog_migrate/c0a7e007b7f8f091bc46433c820d90d4.png)
模拟数据:
df = mixedDesign(B = 6, n = 30, # B 表示 between-subject
M = matrix(c(250, 300, 350, 200, 300, 400),ncol = 1), SD = 30)
注意这里各条件的均值要以矩阵的形式输入,每一行表示一个被试内的因素,每一列表示一个被试间的因素。这里数据中的两个因素都是被试间,因此先按一个因素的设计来生成,即输入一个6行1列的矩阵。
生成的数据如下,第一列为条件,第二列为编号(1-180
),第三列为因变量:
> head(df)
B_A id DV
1 A1 1 241.4539
2 A1 2 276.0513
3 A1 3 205.3806
4 A1 4 224.5472
5 A1 5 329.0166
6 A1 6 233.3297
下面对第一列变量进行重新编码,用两个变量(方向-direction
,和 距离-distance
)来表示。
这里涉及到以下几点:1.数据框内的子集选取;2.数据框中如何生成新变量;3.判断语句的迭代。对于最后一点,在excel中有常用到。
R中的子集选取运算符有三种:1. $
;2. []
;3.[[]]
。
对于数据框,第一种运算符的功能是选取某一列,并以一维数组的形式返回:
> head(df$DV)
[1] 241.4539 276.0513 205.3806 224.5472 329.0166 233.3297
> is.vector(df$DV)
[1] TRUE
第二种运算符的功能有多种,一个是选取列,并以数据框的形式返回:
> head(df[1:2])
B_A id
1 A1 1
2 A1 2
3 A1 3
4 A1 4
5 A1 5
6 A1 6
> is.data.frame(df[1:2])
[1] TRUE
也可以根据列名返回 (返回结果仍为数据框):
> head(df[c('DV','id')])
DV id
1 241.4539 1
2 276.0513 2
3 205.3806 3
4 224.5472 4
5 329.0166 5
6 233.3297 6
> is.data.frame(df[c('DV','id')])
[1] TRUE
但不能返回不存在的列:
> head(df[c('XX')])
Error in `[.data.frame`(df, c("XX")) : undefined columns selected
二是可以输入坐标(格式为[行坐标,列坐标]
)返回,返回结果仍为数据框,比如返回第2到第10行:
> df[1:10, ]
B_A id DV
1 A1 1 241.4539
2 A1 2 276.0513
3 A1 3 205.3806
4 A1 4 224.5472
5 A1 5 329.0166
6 A1 6 233.3297
7 A1 7 298.4980
8 A1 8 264.9493
9 A1 9 263.0668
10 A1 10 244.2183
返回第1列和第3列的第1、3、5、7、9行:
> df[c(1,3,5,7,9), c(1,3)]
B_A DV
1 A1 241.4539
3 A1 205.3806
5 A1 329.0166
7 A1 298.4980
9 A1 263.0668
第三种运算符只能选取某一列,返回结果为一维数组:
> df[[1]] # 返回第一列
[1] A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1
[26] A1 A1 A1 A1 A1 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A2
[51] A2 A2 A2 A2 A2 A2 A2 A2 A2 A2 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3
[76] A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A3 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4
[101] A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A5 A5 A5 A5 A5
[126] A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5 A5
[151] A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6
[176] A6 A6 A6 A6 A6
Levels: A1 A2 A3 A4 A5 A6
> is.data.frame(df[[1]])
[1] FALSE
也可以按列名返回: