Skip to Tutorial Content

知识点

  • R语言的基础逻辑
  • 简单代数
  • 线性代数

初等代数

四则运算

1 + 2; 1.5 + 2.4
## [1] 3
## [1] 3.9
3 - 4; -6 - 7
## [1] -1
## [1] -13
5 * 6; 23 * 14
## [1] 30
## [1] 322
7 / 8; -9 / 0.2
## [1] 0.875
## [1] -45

; 在R中有连接两个独立命令行的作用。

请根据以上命令,求解下题:

\[\frac{\frac{365}{12}}{\frac{28 + 24}{10} - (36 + 72) \times 5}\]

(365 / 12) / ((28 + 24)/10 - (36 + 72) * 5)

复杂代数

sqrt(9)
## [1] 3
10^2
## [1] 100
5%%3 #余数
## [1] 2
log(11)
## [1] 2.397895
log10(100)
## [1] 2
exp(12)
## [1] 162754.8

乃至三角函数:

sin(pi)
## [1] 1.224647e-16
cos(pi)
## [1] -1
tan(pi/2)
## [1] 1.633124e+16
acos(1)
## [1] 0
asin(1)
## [1] 1.570796
atan(0.5)
## [1] 0.4636476

科学计数法

tan(pi/2)
## [1] 1.633124e+16

一个数被写成一个实数a与一个10的n次幂的积。 其中E(exponential)用来表示10的幂 举几个例子:

\[200 = 2e + 2, \] \[0.002 = 2e-3,\] \[333.3 = 3.333e + 2,\] \[-45,000 = -4.5e + 4.\]

2.8e + 10 代表什么?

format(2.8e+10, scientific = FALSE, big.mark = ',')

布尔代数(Boolean algebra)

  • 基础是逻辑判断: 真用TRUE代表,假用FALSE代表,也可以简写为TF
  • 常见运算符:
    • 否(!)、等于(==)、不等于(!=)、大于(>)、小于(<)、与(&)、并(|
    • 当然还能衍生出复合型的大于等于(>=)、小于等于(<=)。

举几个例子:

1 == 2
## [1] FALSE
1 != 2
## [1] TRUE
1 > 2
## [1] FALSE
1 < 2
## [1] TRUE
1 >= 2
## [1] FALSE
1 <= 2
## [1] TRUE
1 & 2 > 2
## [1] FALSE
1 | 2 > 2
## [1] TRUE

下面这个式子的结果是什么?

3 > 2 > 1
(3 > 2) & (2 > 1)

很多朋友在刚使用编程语言时候都会不习惯用两个等号(==)来表示“等于”,但从理解的角度,可将其视作==, !=, >=, <=中的一员看待。

向量

在R中,向量也是最基础的数据呈现方式。

  • 数学:一串有方向的数,或者说用一串数来记录一个有方向动作。
    • 如果方向被拿掉了就变成了纯量(scalar)。
  • 数据:与变量(variable)对等,创建一个向量就可被视作创建了一个变量。

从这个意义上,变量可被视作“有概念意义的向量”。

向量表达

  • 数学:\({\displaystyle {\vec {a}}=(11, 12, 13, 14, 15)}\)
    • \(\vec {a}_2 = 2; \vec {a}_5 = 5\)
  • R:a <- c(11, 12, 13, 14, 15)
    • c: Concatenate/combine
a <- c(11, 12, 13, 14, 15)

a[2]
## [1] 12
a[5]
## [1] 15
  • <-: 赋值符(assign)
  • :: a <- 1:5
  • TRUEFALSE不留

b <- 10 * 1:5
b
## [1] 10 20 30 40 50

# 结果是什么?
c(1.5:3)
## [1] 1.5 2.5

如何表示\(\vec {b}=(1, 3, 4, 5, 6, 7, 9)\)?

b <- c(1, 3:7, 9)

  • seq()
    • seq
    • ()

重复上面的例子:

a <- seq(from = 1, to = 5)
a
## [1] 1 2 3 4 5

seq()的便捷之处在于可以定义步长:

c <- seq(from = 1, to = 5, by = 3)
c

#d <- seq(from = 1, to = 5, by = 0.5)
#d

seq()另一个功能是体现元素位置。

比如:如何选出d的偶数项

提示:

  1. 确定索引;
  2. 找出索引中的各位是否是偶数位(是否能被2整除),是用TRUE标明;
  3. 在第二步基础上根据“TRUEFALSE不留”的规则将向量中为偶数位的元素保留成为一个新向量。
d[seq(d) %% 2 == 0]

向量四则运算

  • 加减法:\[\vec{a} \pm \vec{b} = (a_1 \pm b_1, a_2 \pm b_2, ..., a_n \pm b_n).\]
  • 乘法则要略微复杂,有不同类型。
    • 点乘:可以有两种表达方式
      1. 代数表达式:\(\vec{a}\cdot \vec{b} = \sum a_ib_i\)
        • 这里包含一种特殊情况,纯量×向量:\(c\vec{x} = (cx_1, cx_2,..., cx_n).\)
      2. 几何表达式:\(\vec{a}\cdot \vec{b} = ||\vec{a}||||\vec{b}||cos\theta\),其中\(||\vec{a}||\)是向量的欧几里得范数(\(\sqrt{a^{2}_1 + \ldots + a^{2}_n}\)),θ是两个向量的夹角。
      • R中用*连接两个向量,输出点乘结果。
    • 叉乘:将两个变量在共同的单位向量上相乘的方法。
      • 使用%o%连接两个向量或者使用outer()命令计算。
a + b
## [1] 11 22 33 44 55
a - b
## [1]  -9 -18 -27 -36 -45
a * b
## [1]  10  40  90 160 250
a / b
## [1] 0.1 0.1 0.1 0.1 0.1

当进行运算的向量不等长时,短向量的元素将依序循环使用,如下例:

a
## [1] 1 2 3 4 5
e <- c(1, 2)

a * e
## [1] 1 4 3 8 5

叉乘在R中其实还能做一些数据之外的事情。

举例:用这个功能来用R推演一下天干地支。

tiangan <- c("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸")
dizhi <- c("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥")

提示:

阅者诸君周知,有十天干,十二地支。 它们共有一百二十种组合,先民取其中六十种组为干支纪年。 选择方法是阳(奇)数配阳数,阴(偶)数配阴数。

tg_yang <- tiangan[seq(tiangan) %% 2 == 1]
tg_yin <- tiangan[seq(tiangan) %% 2 == 0]

dz_yang <- dizhi[seq(dizhi) %% 2 == 1]
dz_yin <- dizhi[seq(dizhi) %% 2 == 0]

outer(tg_yang, dz_yang, FUN = paste0)
outer(tg_yin, dz_yin, FUN = paste0)

向量性质

a
## [1] 1 2 3 4 5
#长度
length(a)
## [1] 5
#最值
max(a)
## [1] 5
min(a)
## [1] 1
#平均值
mean(a)
## [1] 3
#中位数
median(a)
## [1] 3
#方差
var(a)
## [1] 2.5

这些命令在之后基于数据的变量运算中均可通用。

矩阵

  • 数学:

\[ A_{2\times2} = \left(\begin{array}{cc} 1 & 3\\ 2 & 4 \end{array}\right) \]

  • R:
A <- matrix(1:4, nrow = 2)
A
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4

  • 数学: 在矩阵\(A_{2\times2}\)中,它的元素通常以行×列的方式标记,比如\(A_{12}\)就代表矩阵第1行、第2列的元素,即\(3\)
  • R:
A[1, 2]
## [1] 3
A[1, ]
## [1] 1 3
A[ , 2]
## [1] 3 4

单一矩阵运算

B <- matrix(1:6, nrow = 3)
B
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6
dim(B)
## [1] 3 2
t(B)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
t(t(B))
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6

t(t(B)) 嵌套的做法。

矩阵运算

  • 加(减)法:只能在同型矩阵间进行(同行数、同列数),\(A \pm B = a_{ij} \pm b_{ij}\);
  • 乘法:纯量乘积、一般乘积、Hadamard积、Kronecker积等。这里仅介绍和之后数据处理较为相关的纯量乘积、一般乘积。
    • 纯量乘积:\({\displaystyle (rA)_{ij}=r\cdot a_{ij}\ }\),与代数乘法方法相同。
    • 一般乘积:只有在前矩阵列数与后矩阵行数相等时才有定义,其运算也就是对应的前列与后行的代数乘积之和,如下图所示,

在R中,将两个符合定义性质的向量用%*%连接就可以进行这种运算。

B
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6
C <- matrix(7:12, nrow = 3)

B + C
##      [,1] [,2]
## [1,]    8   14
## [2,]   10   16
## [3,]   12   18
B - C
##      [,1] [,2]
## [1,]   -6   -6
## [2,]   -6   -6
## [3,]   -6   -6
10 * B
##      [,1] [,2]
## [1,]   10   40
## [2,]   20   50
## [3,]   30   60
D <- matrix(1:6, nrow = 2)
D
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
dim(B)
## [1] 3 2
dim(D)
## [1] 2 3
B %*% D
##      [,1] [,2] [,3]
## [1,]    9   19   29
## [2,]   12   26   40
## [3,]   15   33   51

方程组

用R解一个三元一次方程组:

\[ \begin{equation} \begin{cases} x + y + z = 6, \\ 3x + 2y + 4z = 9, \\ 2x + 2y - 6z = 4. \end{cases} \end{equation} \]

  • 矩阵E代表方程系数
  • \(b\)为方程的右侧
  • \(x\)是方程的解

\[ \begin{align} \vec{b} =& \vec{E}\vec{x},\\ \begin{bmatrix} 6 \\ 9 \\ 4 \end{bmatrix} =& \begin{bmatrix} 1 & 1 & 1 \\ 3 & 2 & 4 \\ 2 & 2 & -6 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \end{bmatrix} \end{align}. \]

E <- matrix(c(1, 3, 2, 1, 2, 2, 1, 4, -6), nrow = 3)
E
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    3    2    4
## [3,]    2    2   -6
b <- c(6, 9, 4)

x <- solve(E, b)
x
## [1] -5 10  1

解方程组的一个直接应用就是解回归方程。 回归方程通常可以以线性代数方式表达: 比如,对一个基本的回归就可以写成如下形式,就和我们上面解的方程组非常相似了:

\[ \begin{align} y& =& &\beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n + \epsilon\\ \vec{y}& =& &\vec{x}\vec{\beta} + \vec{\epsilon}.\\ \uparrow& & &\uparrow\uparrow\\ \vec{b}& =& &\vec{E}\vec{x} \end{align} \]

要点总结

  • 简单代数
    • 科学计数法
    • 布尔代数
  • 线性代数
    • 向量
    • 矩阵
    • 方程组

基础语法: 线性代数

Learning R with Dr. Hu and His Friends

胡悦(清华大学政治学系)