《生物统计学》上机内容(一)


教学内容

  • 本节课主要介绍R语言的基本操作与描述性统计。
  • 以下内容仅用于北京林业大学生态与自然保护学院《生物统计学》的第一节上机内容。


参考资料


数据下载链接


R语言教程

# ==============================================
# 预处理
# ==============================================
# 清理内存
rm(list = ls())
gc()
##          used (Mb) gc trigger (Mb) max used (Mb)
## Ncells 414692 22.2     861101   46   647465 34.6
## Vcells 756612  5.8    8388608   64  1660157 12.7
# 加载 package
# 如果package加载没成功
# install.packages("psych")
library(psych)

# 加载工作区域
# 需要在setwd里面设置自己的文件路径
setwd("F:/2021.生物统计学教程/2021年生物统计学/数据")
getwd() 
## [1] "F:/2021.生物统计学教程/2021年生物统计学/数据"
# ==============================================
# 描述性统计
# ==============================================
# 加载数据
data <- read.csv("grades.csv")

# 查看数据格式
head(data) # 展示数据前六行 
##        id  lastname firstname gender ethnicity year lowup section  gpa extcr
## 1 106,484 VILLARRUZ    ALFRED   Male         2    2     1       2 1.18     1
## 2 108,642 VALAZQUEZ     SCOTT   Male         4    3     2       2 2.19     2
## 3 127,285    GALVEZ    JACKIE Female         4    4     2       2 2.46     2
## 4 132,931   OSBORNE       ANN Female         3    2     1       2 3.98     1
## 5 140,219    GUADIZ   VALERIE Female         2    4     2       1 1.84     1
## 6 142,630   RANGIFO   TANIECE Female         4    3     2       3 3.90     1
##   review quiz1 quiz2 quiz3 quiz4 quiz5 final total percent grade passfail
## 1      2     6     5     7     6     3    53    80      64     D        P
## 2      1    10    10     7     6     9    54    96      77     C        P
## 3      2    10     7     8     9     7    57    98      78     C        P
## 4      1     7     8     7     7     6    68   103      82     B        P
## 5      1     7     8     9     8    10    66   108      86     B        P
## 6      2    10    10    10     9     9    74   122      98     A        P
str(data) # 展示数据格式
## 'data.frame':    105 obs. of  21 variables:
##  $ id       : chr  "106,484" "108,642" "127,285" "132,931" ...
##  $ lastname : chr  "VILLARRUZ" "VALAZQUEZ" "GALVEZ" "OSBORNE" ...
##  $ firstname: chr  "ALFRED" "SCOTT" "JACKIE" "ANN" ...
##  $ gender   : chr  "Male" "Male" "Female" "Female" ...
##  $ ethnicity: int  2 4 4 3 2 4 2 5 4 3 ...
##  $ year     : int  2 3 4 2 4 3 3 2 3 3 ...
##  $ lowup    : int  1 2 2 1 2 2 2 1 2 2 ...
##  $ section  : int  2 2 2 2 1 3 3 1 1 2 ...
##  $ gpa      : num  1.18 2.19 2.46 3.98 1.84 3.9 2.84 3.57 3.95 3.49 ...
##  $ extcr    : int  1 2 2 1 1 1 2 1 2 2 ...
##  $ review   : int  2 1 2 1 1 2 1 2 2 1 ...
##  $ quiz1    : int  6 10 10 7 7 10 10 10 10 10 ...
##  $ quiz2    : int  5 10 7 8 8 10 9 9 10 10 ...
##  $ quiz3    : int  7 7 8 7 9 10 10 10 10 9 ...
##  $ quiz4    : int  6 6 9 7 8 9 10 10 10 10 ...
##  $ quiz5    : int  3 9 7 6 10 9 10 10 9 10 ...
##  $ final    : int  53 54 57 68 66 74 63 71 74 75 ...
##  $ total    : int  80 96 98 103 108 122 112 120 123 124 ...
##  $ percent  : int  64 77 78 82 86 98 90 96 98 99 ...
##  $ grade    : chr  "D" "C" "C" "B" ...
##  $ passfail : chr  "P" "P" "P" "P" ...
# 使用R自带的功能进行描述性统计 
# 平均数
mean(data$total, na.rm = TRUE)
## [1] 100.5714
# 标准差
sd(data$total, na.rm = TRUE)
## [1] 15.29948
# 标准误
se <- sd(data$total)/sqrt(length(data$total))
se
## [1] 1.493077
# data$total的数据汇总
summary(data$total)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    51.0    92.0   103.0   100.6   111.0   124.0
# 使用psych::describe函数对其中的total数据进行描述性统计
describe(data$total)
##    vars   n   mean   sd median trimmed   mad min max range  skew kurtosis   se
## X1    1 105 100.57 15.3    103   101.8 13.34  51 124    73 -0.81     0.77 1.49
# ==============================================
# 作图
# ==============================================
# 使用hist函数建立直方图
hist(x = data$total, # 输入数据 
     probability = TRUE,  # y轴显示概率
     col = "gray", # 调整颜色
     xlab = "total scores", # x轴命名为"total scores"
     main = "Histogram of total scores" # 图命名为"Histogram of total scores"
     )

# 计算数据的平均值和标准差
total.mean <- mean(data$total)
total.sd <- sd(data$total)

# 生成正太分布数据 
curve(dnorm(x, mean = total.mean, sd = total.sd), col = "red", add = TRUE)

# 使用stem函数建立茎叶图
stem(data$total)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##    5 | 12
##    5 | 
##    6 | 
##    6 | 56
##    7 | 00
##    7 | 5789
##    8 | 01444
##    8 | 7888
##    9 | 00022222334
##    9 | 56666777778888888999
##   10 | 0133344
##   10 | 556666777788888999999
##   11 | 11123334
##   11 | 5678888
##   12 | 000122233344
# 使用boxplot函数建立盒装图
boxplot(data$total, ylab = "total scores")

# 使用qqnorm函数建立qq图
qqnorm(data$total, main = "Normality check via QQ plot")
qqline(data$total, col = "red")

# ==============================================
# 正态分布检验
# ==============================================
# 使用One-sample Kolmogorov-Smirnov test
# 当p-value大于0.05时,数据才满足正太分布
# 如果存在软件报错:如ties should not be present for the Kolmogorov-Smirnov test
# 说明样本数据中存在有相同的值,单样本K-S检验要求检验分布是连续的,
# 而连续分布出现相同值的概率为0.如果是出现相同的,则连续分布的假设不成立,
# 则该方法无法使用
# 数据标准化
total.scaled <- scale(data$total)

# 正态检验
ks.test(total.scaled, "pnorm")
## Warning in ks.test(total.scaled, "pnorm"): ties should not be present for the
## Kolmogorov-Smirnov test
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  total.scaled
## D = 0.08731, p-value = 0.4002
## alternative hypothesis: two-sided
# 另一种选择:使用nortest::lillie.test做正态分布检验
library(nortest)
lillie.test(data$total)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  data$total
## D = 0.08731, p-value = 0.04711