第一题题目描述

A.1 下面是统计学院本科二年级部分学生的年龄: AGE: 18, 23, 22, 21, 20, 19, 20, 20, 20
用 R 命令完成以下操作:
(1) 将前三名学生的年龄输入向量 first3;
(2) 将剩余学生的年龄输入向量 except3;
(3) 在 except3 的第 3 个位置后插入新生的年龄 19;
(4) 将 (3) 中更新过的学生中第 2 名学生的年龄更改为 22。

第一题题目解答

# (0) 原始数据输入
age <- c(18, 23, 22, 21, 20, 19, 20, 20, 20)

# (1) 提取前三个年龄
first3 <- age[1:3]
cat("(1) first3 =", first3, "\n")
## (1) first3 = 18 23 22
# (2) 提取剩余年龄(第4到最后一个元素)
except3 <- age[4:length(age)]
cat("(2) except3 =", except3, "\n")
## (2) except3 = 21 20 19 20 20 20
# (3) 在except3的第3个位置后插入19(即插入到第4个位置)
except3 <- append(except3, 19, after = 3)
cat("(3) 插入后的except3 =", except3, "\n")
## (3) 插入后的except3 = 21 20 19 19 20 20 20
# (4) 修改第2个位置为22
except3[2] <- 22
cat("(4) 最终except3 =", except3, "\n")
## (4) 最终except3 = 21 22 19 19 20 20 20

第二题题目描述

A.2 思考以下命令的输出,用文字描述每一条语句的作用,并上机验证: (1) a1 <-rep(1:3, rep(2, 3)) (2) a2 <-c(1, 8, 10, 11) a3 <-seq(1, 30, length(a2)) (3) a4 <-seq(1, 5, 2) a4 <-c(a1, a4, rep(0, 2)) (4) a5 <-2:10 a6 <-c(a2, a3[-(1:3)], a4) (5) a7 <-c(rep(1, 10), rep(0, 8))

第二题题目解答

# (1) 生成向量a1:将1、2、3分别重复2次
a1 <- rep(1:3, rep(2, 3))  # 等价于rep(1:3, each=2)
cat("(1) a1 =", a1, "\n\n")
## (1) a1 = 1 1 2 2 3 3
# (2) 生成向量a2和a3:
# a2为手动输入的数值向量
a2 <- c(1, 8, 10, 11)
# a3生成从1到30的等距序列,长度与a2相同(即4个点)
a3 <- seq(1, 30, length.out = length(a2))
cat("(2) a3 =", a3, "\n\n")
## (2) a3 = 1 10.66667 20.33333 30
# (3) 生成向量a4:
# 首先生成步长为2的序列1,3,5
a4_temp <- seq(1, 5, by = 2)
# 然后将a1、a4_temp和两个0合并
a4 <- c(a1, a4_temp, rep(0, 2))
cat("(3) a4 =", a4, "\n\n")
## (3) a4 = 1 1 2 2 3 3 1 3 5 0 0
# (4) 生成向量a5和a6:
# a5为2到10的整数序列
a5 <- 2:10
# a6合并a2、a3去除前3个元素后的值(即保留第4个元素)和a4
a6 <- c(a2, a3[-(1:3)], a4)
cat("(4) a6 =", a6, "\n\n")
## (4) a6 = 1 8 10 11 30 1 1 2 2 3 3 1 3 5 0 0
# (5) 生成向量a7:前10个为1,后8个为0
a7 <- c(rep(1, 10), rep(0, 8))
cat("(5) a7 =", a7, "\n")
## (5) a7 = 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0

第三题题目描述

A.3 上机实践:将 MASS 数据包用命令 library(MASS) 加载到 R 中,调用自带“老忠实”喷泉数据集 geyser,完成以下任务: (1) 将等待时间在 70min 以下的数据挑选出来; (2) 将等待时间在 70min 以下,且不等于 57min 的数据挑选出来; (3) 将等待时间在 70min 以下的喷泉的喷涌时间挑选出来; (4) 将喷涌时间大于 70min 的喷泉的等待时间挑选出来。

第三题题目解答

# (0) 加载数据包和数据集
library(MASS)
data(geyser)

# (1) 筛选等待时间 <70 的数据
subset1 <- subset(geyser, waiting < 70)
cat("(1) 等待时间 <70 的数据前3行:\n")
## (1) 等待时间 <70 的数据前3行:
print(head(subset1, 3))
##    waiting duration
## 3       57 4.000000
## 7       60 4.383333
## 10      56 4.833333
# (2) 筛选等待时间 <70 且不等于57的数据
subset2 <- subset(geyser, waiting < 70 & waiting != 57)
cat("\n(2) 等待时间 <70 且 ≠57 的数据前3行:\n")
## 
## (2) 等待时间 <70 且 ≠57 的数据前3行:
print(head(subset2, 3))
##    waiting duration
## 7       60 4.383333
## 10      56 4.833333
## 12      50 5.450000
# (3) 提取等待时间 <70 的喷涌时间
duration_subset <- subset1$duration  # 直接使用 subset1 的结果
cat("\n(3) 前5个喷涌时间:", head(duration_subset, 5), "\n")
## 
## (3) 前5个喷涌时间: 4 4.383333 4.833333 5.45 4.866667
# (4) 提取喷涌时间 >70 的等待时间
waiting_subset <- geyser$waiting[geyser$duration > 70]
cat("\n(4) 前5个等待时间:", head(waiting_subset, 5), "\n")
## 
## (4) 前5个等待时间:

第四题题目描述

用 R 随机产生100个服从 \(N(3,5)\) 的观测值和 20个服从 \(N(5,3)\) 的观测值,做出直方图、箱线图和 Q-Q图进行观察,并解释特征。(设定 R 中产生随机数的种子为 set.seed(1234))

第四题题目解答

# (0) 设置随机种子并生成数据
set.seed(1234)

# 生成两组数据
data_n35 <- rnorm(n = 100, mean = 3, sd = sqrt(5))  # N(3,5):均值为3,方差为5
data_n53 <- rnorm(n = 20, mean = 5, sd = sqrt(3))   # N(5,3):均值为5,方差为3

# (1) 直方图
par(mfrow = c(2, 3))  # 设置2行3列的图形布局

# 第一组数据(N(3,5))
hist(data_n35, main = "N(3,5) 直方图", xlab = "观测值", col = "lightblue", breaks = 15)
hist(data_n53, main = "N(5,3) 直方图", xlab = "观测值", col = "lightgreen", breaks = 10)

# (2) 箱线图
boxplot(data_n35, main = "N(3,5) 箱线图", col = "lightblue")
boxplot(data_n53, main = "N(5,3) 箱线图", col = "lightgreen")

# (3) Q-Q图
qqnorm(data_n35, main = "N(3,5) Q-Q图")
qqline(data_n35, col = "red")
qqnorm(data_n53, main = "N(5,3) Q-Q图")
qqline(data_n53, col = "red")

par(mfrow = c(1, 1))  # 恢复默认图形布局
  1. 直方图分析 {.section-box}

    N(3,5)

    • 分布中心:直方图峰值位于3附近,与理论均值一致
    • 数据范围:观测值集中在 -2到8,符合正态分布范围(3 ± 3σ ≈ 3 ± 6.7)
    • 形态特征:接近对称钟形,尾部轻微右偏

    N(5,3)

    • 分布中心:峰值在5附近,但样本量小(n=20)导致波动明显
    • 数据范围:观测值在 2到8,符合 5 ± 3σ ≈ 5 ± 5.2
    • 形态特征:右侧拖尾,可能因小样本随机性导致
  2. 箱线图分析 {.section-box}

    N(3,5)

    • 中位数:接近理论均值3,箱体范围(IQR)反映数据集中在2.5~4.5
    • 异常值:无明显离群点,分布较集中

    N(5,3)

    • 中位数:略高于5,箱体范围较窄(4.5~5.5)
    • 异常值:右侧存在一个离群点(可能因样本量小导致)
  3. Q-Q图分析 {.section-box}

    N(3,5)

    • 正态性:散点基本沿参考线分布,尾部轻微偏离,整体符合正态性

    N(5,3)

    • 正态性:尾部散点偏离参考线,右端上翘,小样本下仍可接受为正态分布

第五题题目描述

(数据见chap1  beenswax.txt) 为探测蜂蜡结构,生物学家做了很多实验,每个样本蜡里碳氢化合物 (hydrocarbon) 所占的比例对蜂蜡结构有特殊的意义,数据中给出了一些观测。 (1) 画出 beenswax 数据的经验累积分布图、直方图和Q-Q图; (2) 找出0.90,0.75,0.50,0.25和0.10的分位数; (3) 这个分布是高斯分布吗?

第五题题目解答

# (1) 加载包并读取数据
library(ggplot2)
library(gridExtra)

# 读取数据(确保路径正确)
beeswax_data <- read.delim("C:/Users/Lucy/Downloads/beenswax(4).txt", 
                          header = TRUE,  # 数据包含列名
                          sep = "\t")      # 分隔符为制表符

# 检查数据结构和列类型
str(beeswax_data)
## 'data.frame':    59 obs. of  2 variables:
##  $ MeltingPoint: num  63.8 63.5 63.6 63.1 63.4 ...
##  $ Hydrocarbon : num  14.3 14.8 12.3 17.1 15.1 ...
# 提取目标列(Hydrocarbon)
hydrocarbon <- beeswax_data$Hydrocarbon

# (2) 绘制图形
# ------------------------- 经验累积分布图 -------------------------
p1 <- ggplot(data.frame(hydrocarbon), aes(x = hydrocarbon)) +
  stat_ecdf(geom = "step", color = "#69b3a2", linewidth = 1) +
  labs(title = "经验累积分布图 (ECDF)", x = "碳氢化合物比例 (%)", y = "累积概率") +
  theme_minimal()

# ------------------------- 直方图 -------------------------
p2 <- ggplot(data.frame(hydrocarbon), aes(x = hydrocarbon)) +
  geom_histogram(bins = 15, fill = "#69b3a2", color = "white") +
  labs(title = "直方图", x = "碳氢化合物比例 (%)", y = "频数") +
  theme_minimal()

# ------------------------- Q-Q图 -------------------------
p3 <- ggplot(data.frame(hydrocarbon), aes(sample = hydrocarbon)) +
  stat_qq(color = "#69b3a2") +
  stat_qq_line(color = "red") +
  labs(title = "Q-Q图", x = "理论分位数", y = "样本分位数") +
  theme_minimal()

# 组合图形
grid.arrange(p1, p2, p3, nrow = 2)

# (3) 计算分位数
quantiles <- quantile(hydrocarbon, probs = c(0.10, 0.25, 0.50, 0.75, 0.90))
cat("\n分位数:\n")
## 
## 分位数:
print(round(quantiles, 2))
##   10%   25%   50%   75%   90% 
## 13.68 14.07 14.57 15.12 15.47
# (4) 正态性检验(Shapiro-Wilk检验)
if (length(hydrocarbon) <= 5000) {
  shapiro_test <- shapiro.test(hydrocarbon)
  cat("\nShapiro-Wilk检验结果:\n")
  print(shapiro_test)
} else {
  cat("\n样本量超过5000,Shapiro-Wilk检验不可靠,建议使用Kolmogorov-Smirnov检验\n")
  ks_test <- ks.test(hydrocarbon, "pnorm", mean = mean(hydrocarbon), sd = sd(hydrocarbon))
  print(ks_test)
}
## 
## Shapiro-Wilk检验结果:
## 
##  Shapiro-Wilk normality test
## 
## data:  hydrocarbon
## W = 0.9766, p-value = 0.3123
  1. 经验累积分布图 (ECDF) 特征:ECDF曲线呈平滑的S形,中间部分上升较快,两端平缓,接近正态分布的累积分布函数形态,表明数据分布对称且无明显偏态。
  2. 直方图 特征:直方图呈现近似钟形分布,数据集中在中间区域(约14%-17%),两侧逐渐下降,符合正态分布的对称性特征。
  3. Q-Q图 特征:散点大部分沿红色参考线分布,仅尾部轻微偏离,表明数据整体接近正态分布,尾部可能存在轻微厚尾或测量误差,但总体符合正态性。
  4. Shapiro-Wilk检验 p-value = 0.3123 > 0.05,无法拒绝原假设,即数据服从正态分布。