『原创』统计建模与R软件-第二章 R软件的使用
2015-12-08 22:00 Digging4 阅读(8893) 评论(0) 编辑 收藏 举报统计建模与R软件-第二章
2.1 建立一个R文件,在文件中输入变量 \(x=(1,2,3)^T\), \(y=(4,5,6)^T\),并作以下运算。
(1)计算\(z=2x+y+e\),其中\(e=(1,1,1)^T\);
(2)计算\(x\)与\(y\)的内积;
(3)计算\(x\)与\(y\)的外积。
x <- c(1, 2, 3)
y <- c(4, 5, 6)
e <- c(1, 1, 1)
2 * x + y + e
## [1] 7 10 13
crossprod(x, y) #内积
## [,1]
## [1,] 32
tcrossprod(x, y) #外积
## [,1] [,2] [,3]
## [1,] 4 5 6
## [2,] 8 10 12
## [3,] 12 15 18
2.2 将1,2,....,20构成两个4×5阶的矩阵,其中矩阵\(A\)是按列输入,矩阵\(B\)是按行输入,并作如下运算。
(1)\(C=A+B\)
(2)\(D=AB\)
(3)\(E=(e_{ij})_{n×n}\),其中\(e_{ij}=a_{ij}.b_{ij}\)
(4)\(F\)是由\(A\)的前3行和前3列构成的矩阵
(5)\(G\)是由矩阵\(B\)的各列构成的矩阵,但不含\(B\)的第3列。
A <- matrix(1:20, nrow = 4, byrow = FALSE) #按列输入
B <- matrix(1:20, nrow = 4, byrow = TRUE) #按行输入
A
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
B
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 6 7 8 9 10
## [3,] 11 12 13 14 15
## [4,] 16 17 18 19 20
C <- A + B
C
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2 7 12 17 22
## [2,] 8 13 18 23 28
## [3,] 14 19 24 29 34
## [4,] 20 25 30 35 40
D <- A %*% B
## Error: 非整合参数
D
## function (expr, name)
## .Internal(D(expr, name))
## <bytecode: 0x04cb6d4c>
## <environment: namespace:stats>
E <- A * B
E
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 10 27 52 85
## [2,] 12 42 80 126 180
## [3,] 33 84 143 210 285
## [4,] 64 136 216 304 400
F <- A[1:3, 1:3]
F
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
G <- B[, -3]
G
## [,1] [,2] [,3] [,4]
## [1,] 1 2 4 5
## [2,] 6 7 9 10
## [3,] 11 12 14 15
## [4,] 16 17 19 20
2.3 构造一个向量\(x\),向量是由5个1,3个2,4个3和2个4 构成,注意用到rep()函数
c(rep(1, 5), rep(2, 3), rep(3, 4), rep(4, 2))
## [1] 1 1 1 1 1 2 2 2 3 3 3 3 4 4
2.4 生成一个5阶的\(Hilbert\)矩阵,
\[H=(h_{ij})_{n×n}, h_{ij}=\frac{1}{i+j-1},\qquad i,j=1,2,\ldots,n.
\]
(1)计算\(Hilbert\)矩阵\(H\)的行列式
(2)求\(H\)的逆矩阵
(3)求\(H\)的特征值和特征向量
n <- 5
H <- array(0, dim = c(n, n))
for (i in 1:n) {
for (j in 1:n) {
H[i, j] <- 1/(i + j - 1)
}
}
H
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1.0000 0.5000 0.3333 0.2500 0.2000
## [2,] 0.5000 0.3333 0.2500 0.2000 0.1667
## [3,] 0.3333 0.2500 0.2000 0.1667 0.1429
## [4,] 0.2500 0.2000 0.1667 0.1429 0.1250
## [5,] 0.2000 0.1667 0.1429 0.1250 0.1111
det(H) #行列式值
## [1] 3.749e-12
solve(H) #逆矩阵
## [,1] [,2] [,3] [,4] [,5]
## [1,] 25 -300 1050 -1400 630
## [2,] -300 4800 -18900 26880 -12600
## [3,] 1050 -18900 79380 -117600 56700
## [4,] -1400 26880 -117600 179200 -88200
## [5,] 630 -12600 56700 -88200 44100
eigen(H) #特征值和特征向量
## $values
## [1] 1.567e+00 2.085e-01 1.141e-02 3.059e-04 3.288e-06
##
## $vectors
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.7679 0.6019 -0.2142 0.04716 0.006174
## [2,] 0.4458 -0.2759 0.7241 -0.43267 -0.116693
## [3,] 0.3216 -0.4249 0.1205 0.66735 0.506164
## [4,] 0.2534 -0.4439 -0.3096 0.23302 -0.767191
## [5,] 0.2098 -0.4290 -0.5652 -0.55760 0.376246
2.5 已知有5名学生的数据,如表2.3所示,用数据框的形式读入数据。
序号 | 姓名 | 性别 | 年龄 | 身高(cm) | 体重(kg) |
---|---|---|---|---|---|
1 | 张三 | 女 | 14 | 156 | 42.0 |
2 | 李四 | 男 | 15 | 165 | 49.0 |
3 | 王五 | 女 | 16 | 157 | 41.0 |
4 | 赵六 | 男 | 14 | 162 | 52.0 |
5 | 丁一 | 女 | 15 | 159 | 45.5 |
df <- data.frame(seq = 1:5, name = c("张三", "李四", "王五", "赵六", "丁一"),
sex = c("女", "男", "女", "男", "女"), age = c(14, 15, 16, 14, 15), height = c(156,
165, 157, 162, 159), weight = c(42, 49, 41, 52, 45.5))
df
## seq name sex age height weight
## 1 1 张三 女 14 156 42.0
## 2 2 李四 男 15 165 49.0
## 3 3 王五 女 16 157 41.0
## 4 4 赵六 男 14 162 52.0
## 5 5 丁一 女 15 159 45.5
2.6 将例2.5中的数据表2.3的数据写成一个纯文本文件,用函数read.table()读该文件,然后再用函数write.csv()写成一个能用excel表能打开的文件,并用excel表打开。
df <- data.frame(seq = 1:5, name = c("张三", "李四", "王五", "赵六", "丁一"),
sex = c("女", "男", "女", "男", "女"), age = c(14, 15, 16, 14, 15), height = c(156,
165, 157, 162, 159), weight = c(42, 49, 41, 52, 45.5))
write.table(df, "ch2_2_6.txt")
df2 <- read.table("ch2_2_6.txt")
write.csv(df2, "ch2_2_6.csv")
2.7 编写一个R程序(函数)。输入一个整\(n\),如果\(n<=0\),则终止运算,并输出一句话:“要求输入一个正整数”;否则,如果\(n\)是偶数,则将\(n\)除2,并赋值给\(n\);否则将\(3n+1\)赋给\(n\),不断循环,直到\(n=1\),才停止运算,并输出一句话:“运算成功”.这个例子是为了验证数论中的一个简单定理。
fcul <- function(n) {
if (n <= 0)
list(msg = "要求输入一个正整数") else {
repeat {
if (n == 1)
break
if (n%%2 == 0) {
n = n/2
} else {
n = 3 * n + 1
}
}
list(msg = "运算成功")
}
}
fcul(-1)
## $msg
## [1] "要求输入一个正整数"
fcul(10)
## $msg
## [1] "运算成功"
本文由digging4发表于:http://www.cnblogs.com/digging4/p/5031186.html