知识点
- 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
代表,也可以简写为T
和F
。 - 常见运算符:
- 否(
!
)、等于(==
)、不等于(!=
)、大于(>
)、小于(<
)、与(&
)、并(|
) - 当然还能衍生出复合型的大于等于(
>=
)、小于等于(<=
)。
- 否(
举几个例子:
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
TRUE
留FALSE
不留
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
的偶数项
提示:
- 确定索引;
- 找出索引中的各位是否是偶数位(是否能被2整除),是用
TRUE
标明; - 在第二步基础上根据“
TRUE
留FALSE
不留”的规则将向量中为偶数位的元素保留成为一个新向量。
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).\]
- 乘法则要略微复杂,有不同类型。
- 点乘:可以有两种表达方式
- 代数表达式:\(\vec{a}\cdot \vec{b} = \sum
a_ib_i\)。
- 这里包含一种特殊情况,纯量×向量:\(c\vec{x} = (cx_1, cx_2,..., cx_n).\)
- 几何表达式:\(\vec{a}\cdot \vec{b} = ||\vec{a}||||\vec{b}||cos\theta\),其中\(||\vec{a}||\)是向量的欧几里得范数(\(\sqrt{a^{2}_1 + \ldots + a^{2}_n}\)),θ是两个向量的夹角。
- R中用
*
连接两个向量,输出点乘结果。
- 代数表达式:\(\vec{a}\cdot \vec{b} = \sum
a_ib_i\)。
- 叉乘:将两个变量在共同的单位向量上相乘的方法。
- 使用
%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} \]
要点总结
- 简单代数
- 科学计数法
- 布尔代数
- 线性代数
- 向量
- 矩阵
- 方程组