跳转至

Data Analysis

Statistical Analysis

1. 描述性分析统计

myvars <- c("mpg", "hp", "wt")
# summary()
summary(mtcars[myvars])
      mpg              hp              wt       
 Min.   :10.40   Min.   : 52.0   Min.   :1.513  
 1st Qu.:15.43   1st Qu.: 96.5   1st Qu.:2.581  
 Median :19.20   Median :123.0   Median :3.325  
 Mean   :20.09   Mean   :146.7   Mean   :3.217  
 3rd Qu.:22.80   3rd Qu.:180.0   3rd Qu.:3.610  
 Max.   :33.90   Max.   :335.0   Max.   :5.424

# sapply(x, FUN, options)
myfun <- function(x) c(mean=mean(x), max=max(x), min=min(x))
sapply(mtcars[myvars], myfun)
##           mpg       hp      wt
## mean 20.09062 146.6875 3.21725
## max  33.90000 335.0000 5.42400
## min  10.40000  52.0000 1.51300

# Hmisc的describe()
library(Hmisc)
describe(mtcars[myvars])

# pastecs包的stat.desc()函数
library(pastecs)
stat.desc(mtcars[myvars])

# pysch包的describe()
library(pysch)
describe(mtcars[myvars]) # PS同名函数最后载入的包优先

# 分组统计
# aggregate
aggregate(mtcars[myvars], by=list(am=mtcars$am), mean)
##   am      mpg       hp       wt
## 1  0 17.14737 160.2632 3.768895
## 2  1 24.39231 126.8462 2.411000
aggregate(mtcars[myvars], by=list(mtcars$am), mean)
##   Group.1      mpg       hp       wt
## 1       0 17.14737 160.2632 3.768895
## 2       1 24.39231 126.8462 2.411000
# 但无法一次返回多个变量,所以采用by(data, INDICES, FUN)函数
by(mtcars[myvars], mtcars$am, function(x) sapply(x, myfun))
## mtcars$am: 0
##           mpg       hp       wt
## mean 17.14737 160.2632 3.768895
## max  24.40000 245.0000 5.424000
## min  10.40000  62.0000 2.465000
## ------------------------------------------------ 
## mtcars$am: 1
##           mpg       hp    wt
## mean 24.39231 126.8462 2.411
## max  33.90000 335.0000 3.570
## min  15.00000  52.0000 1.513

2. 频数表与列联表

library(vcd)
# 生成一维列联表
mytable <- table(Arthritis$Improved)
## mytable
  None   Some Marked 
    42     14     28

# 转化为频率表
prop.table(mytable)
##      None      Some    Marked 
## 0.5000000 0.1666667 0.3333333

# 转化为百分数
prop.table(mytable) * 100

# ----------------------------

# 生成二维列联表
# 法一
mytable <- xtabs(~ Treatment+Improved, data=Arthritis)
##          Improved
## Treatment None Some Marked
##   Placebo   29    7      7
##   Treated   13    7     21
# 法二
mytable <- table(Arthritis$Treatment, Arthritis$Improved)
# 法三
# 使用gmodels包中的CrossTable()创建二位列联表
library(gmodels)
CrossTable(Arthritis$Treatment, Arthritis$Improved)

# 生成边际频数
margin.table(mytable, 1) # 1指代table语句中的第一个变量
## Treatment
## Placebo Treated 
##      43      41
prop.table(mytable, 1)
##          Improved
## Treatment      None      Some    Marked
##   Placebo 0.6744186 0.1627907 0.1627907
##   Treated 0.3170732 0.1707317 0.5121951

# 添加边际和
addmargins(mytable) # 可以像上面有margin参数,默认是求所有和
##          Improved
## Treatment None Some Marked Sum
##   Placebo   29    7      7  43
##   Treated   13    7     21  41
##   Sum       42   14     28  84

# ----------------------------

# 多维列联表
# 上述函数均可推广到多维,但用ftable结果更好看
ftable(xtabs(~ Treatment+Improved+Sex, data=Arthritis))
##                    Sex Female Male
## Treatment Improved                
## Placebo   None             19   10
##           Some              7    0
##           Marked            6    1
## Treated   None              6    7
##           Some              5    2
##           Marked           16    5

3. 独立性检验

mytable <- xtabs(~Treatment+Improved, data=Arthritis)
# 对二维表的行变量与列变量进行卡方独立性检验
chisq.test(mytable)

##      Pearson's Chi-squared test

## data:  mytable
## X-squared = 13.055, df = 2, p-value = 0.001463

## p<0.05, 拒绝原假设,即结果是Treatment与Improved不独立
## 说明是否改善与是否治疗有关,即药物的治疗是有效的

# Fisher独立性检验
fisher.test(mytable)
##  Fisher's Exact Test for Count Data

## data:  mytable
## p-value = 0.001393
## alternative hypothesis: two.sided

4. 相关

# 相关系数的计算
# 不加参数默认计算Pearson相关系数
cor(iris$Sepal.Length, iris$Sepal.Width)
## [1] -0.1175698
## 负相关

# 计算spearman相关系数
cor(iris$Sepal.Length, iris$Sepal.Width, method='spearman')
## [1] -0.1667777

5. t检验

# 单样本t检验
# 单总体T检验,是检验一个样本平均值与一个已知的总体平均值的差异是否显著
# 原假设:无差异
data <- rnorm(20)  # 默认均值是0,标准差是1
# 由于T检验的前提条件,总体要符合正态分布,只是总体方差未知。所以,我们需要先对选定数据集进行进行正态分布检验。使用Shapiro-Wilk和qq图,作为正态分布检验的方法。
# 正态分布检验:原假设:符合正态分布
shapiro.test(data) # p>0.05 接受原假设,符合正态分布
# 画QQ图
qqnorm(data)
# 画出与qq图相对应的直线
qqline(data)
t.test(data, mu=0) # mu表示的是平均数 p>0.05 表示平均数是0


# 双总体t检验
# 双总体T检验,是检验两个样本平均值,与其各自所代表的总体的差异是否显著
# 双总体T检验又分为两种情况,一种是配对的样本T检验,用于检验两种同质对象,在不同条件下所产生的数据差异性;另一种是独立样本非配对T检验,用于检验两组独立的样本的平均数差异性

# 配对T检验
# 目标:检验两组同质样本,在不同的处理下的样本平均值,是否有显著的差异性。
# 原假设:无显著差异
t.test(extra ~ group, data = sleep, paired = TRUE) # 使用sleep数据集,按group分成2个组,形成配对的数据集。H0原假设,g1和g2两个样本组均值没有显著性差异,对治疗睡眠的效果是一致的。

# 非配对t检验
t.test(extra ~ group, data = sleep) # 按group分成2个组,形成独立的样本,病人按随机进行配对,去掉关联关系。H0原假设,随机选取g1和g2两个样本组均值没有显著性差异,对治疗睡眠的效果是一致的。


Basic Workflow

1. 查看信息

head(BreastCancer)
dim(BreastCancer)        # 相当于shape
unique(BreastCancer$Class) # 与 py 一样
levels(BreastCancer$Class) # 相当于 unique()
table(BreastCancer$Class)  # 相当于 value_counts()

2. 缺失值

a <- c(NA, 1:5)
a
[1] NA  1  2  3  4  5

NA == NA
[1] NA

注意与NaN区分

is.nan(0/0)
[1] TRUE
is.infinite(1/0)
[1] TRUE

检测

is.na(a)
## [1]  TRUE FALSE FALSE FALSE FALSE FALSE
mean(a)
## [1] NA
mean(a, na.rm=T) # 个数取len-na的数量
## [1] 3
# sum 同理

# is.finite() 判断是否是inf值
df <- data.frame(x1 = c(9, 6, NA, 9, 2, 5, NA),
                     x2 = c(NA, 5, 2, 1, 5, 8, 0),
                     x3 = c(1, 3, 5, 7, 9, 7, 5))
df                                       
  x1 x2 x3
1  9 NA  1
2  6  5  3
3 NA  2  5
4  9  1  7
5  2  5  9
6  5  8  7
7 NA  0  5

# 返回有缺失值的行
complete.cases(df)
## [1] FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
df[!complete.cases(df), ]
##   x1 x2 x3
## 1  9 NA  1
## 3 NA  2  5
## 7 NA  0  5

# 删除数据中有缺失值的行
df <- na.omit(df)
##   x1 x2 x3
## 2  6  5  3
## 4  9  1  7
## 5  2  5  9
## 6  5  8  7 


a <- c(NA, 1:5)
b <- na.omit(a)
b
## [1] 1 2 3 4 5