代码改变世界

『原创』统计建模与R软件-第二章 R软件的使用

2015-12-08 22:00  Digging4  阅读(8895)  评论(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