R语言入门学习

R语言

视频链接:https://www.bilibili.com/video/BV19x411X7C6

数据分析过程

数据采集——数据存储——数据分析——数据挖掘——数据可视化——进行决策

1 Rstudio使用

1.1 入门

  • TAB补齐

    • 蓝色:函数
    • 数据框:方框
    • 粉色:内置数据集
  • Alt+Shift+K:显示快捷键

1.2 基础

  • list.files() / dir() :查看工作目录下的文件
  • 变量赋值前不需要进行声明

1.3 Rpackage的移植

Rpack <- installed.package()[,1]
save(Rpack,file="Rpack.Rdata")

#在新设备上可以load加载处Rpack里边的内容,再逐一下载
for (i in Rpack) install.packages(i)

2 数据结构

2.1 R对象

  • 向量、标量
  • 矩阵
  • 数组
  • 列表
  • 数据框
  • 因子
  • 时间序列

2.2 向量

  • 用于存储数值型、字符型或逻辑性数据的一维数组
  • 用函数c创建向量

注意:R语言中字符串要加引号,否则会被当成是对象

  • seq 生成等差数列
  • rep 重复数字

必须为同一类型才能处理

向量化变成主要是因为R语言是统计软件,高效率,避免循环

向量索引

  • R中向量是从1开始而不是从0开始

  • 如果使用负值来索引表示输出除了这个数以外的数字

    #索引该位置的数字,但是不能同时出现正负号
    > x[c(4:18)]
     [1]  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
    #可以使用逻辑值向量输出逻辑值为T的数字,数量可以不用对应上,但是逻辑值多的会出现缺失情况
    y[c(T,T,T,F,F,F)]
    y[y>5]#把y>5的输出
    y[y>5 & y<9]
    
    #字符串访问
    >z <- c("one","two","three")
    >"one" %in% z
     TRUE
    
    > v
    [1] 1 2 3 4 5 6
    > v[20]=4
    > v
     [1]  1  2  3  4  5  6 NA NA NA NA NA NA NA NA NA NA NA NA NA  4
    > append(x = v,values = 99,after = 4)
     [1]  1  2  3  4 99  5  6 NA NA NA NA NA NA NA NA NA NA NA NA NA  4
    

向量运算

  • %%:除运算
  • %/%:整除运算

元素个数不相等时会将个数少的进行循环使用,且数量上必须是倍数关系

逻辑运算:x>5 大于5的向量位置上会变为TRUE,其余变为FALSE

ceiling 返回不小于X的最小整数
floor 返回不大于X的最大整数
trunc 返回整数部分
round 四舍五入,第一个参数是向量,第二个是保留的位数(digits)
sinif 与round差不多,第二个参数是保留的数字数量

统计函数

sum 求和
max/min 返回最大或最小值
range 返回最大值和最小值
mean 均值
var 方差
median 中位数
prod 连乘的积
which 返回索引值

2.3 矩阵

  • 要求每个元素数据格式一样
  • 一般是先按列排布,可以设置byrow=T设置为按行排布

matrix:创建矩阵,可以把原有一维向量合理分配到新矩阵中

> x <- 1:20
> x
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
> v <- matrix(x,4,5)
> v
     [,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
#矩阵行列重命名
> cname <- c("C1","C2","C3","C4","C5")
> rname <- c("R1","R2","R3","R4")
> dimnames(v) <- list(rname,cname)
> v
   C1 C2 C3 C4 C5
R1  1  5  9 13 17
R2  2  6 10 14 18
R3  3  7 11 15 19
R4  4  8 12 16 20

dim

#分配维数
> dim(x) <- c(4,5)
> x
     [,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

矩阵的索引

m[2,] 访问第二行
m[1,2] 访问一行二列的数字
m[1,c(2,3,4)] 访问第一行二三四列的数字
m[-1,2] 去除第一行,取第二列
  • 如果给矩阵赋值了也可以通过行列名称来索引
  • 要注意访问的是行还是列,如果是单独访问行或者列的话,要在前或者后加上逗号

矩阵运算

  • 与线代中矩阵运算相同,行列需要一致
colSums 每一列的和
rowSums 每一行的和
colMeans 每一列的平均值
diag 返回对角线位置的值
m*n 矩阵的内积
m %*% n 矩阵的外积
t(m) 将m进行转置

2.4 数组

  • 数组更像是向量,可以搞成矩阵的形式
  • 用的比较少
> z <- array(1:24)
> z
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
> dim1 <- c("A1","A2")
> dim2 <- c("B1","B2","B3")
> dim3 <- c("C1","C2","C3","C4")
> v <- array(z,c(2,3,4),dimnames = list(dim1,dim2,dim3))
> v
, , C1

   B1 B2 B3
A1  1  3  5
A2  2  4  6

, , C2

   B1 B2 B3
A1  7  9 11
A2  8 10 12

, , C3

   B1 B2 B3
A1 13 15 17
A2 14 16 18

, , C4

   B1 B2 B3
A1 19 21 23
A2 20 22 24

2.5 列表

  • 一些对象的有序集合,可以存储若干向量,矩阵,数据框甚至其他列表的组合
  • 最复杂、最重要
  • 是一维数据集合

list():生成列表

可以赋名称,类似于字典

> a <- (1:20)
> a
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
> b <- "Hello"
> b
[1] "Hello"
> c <- matrix(a,4,5)
> c
     [,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
#创建列表
> mlist <- list(a,b,c)
> mlist
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

[[2]]
[1] "Hello"

[[3]]
     [,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

> mlist[1]
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
#同时访问多个列表元素就需要用到向量

mlist$  (后边会自动引出列表元素)
> mlist$first
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

使用一个中括号表示引用列表第一个元素,使用两个中括号表示引用列表第一个元素的本身
> class(mlist[1])
[1] "list"
> class(mlist[[1]])
[1] "integer"

添加列表元素同样需要两个中括号
删除列表元素:给该位置赋值NULL

2.6 数据框

  • 表格式的数据结构,旨在模拟数据集
  • 是由数据构成的一个矩形数组,行表示观测,列表示变量,矩阵必须为同一数据类型
  • 本质是一个列表,列表元素是向量,每一列必须具有相同的长度,所以数据框是矩形结构,而且数据框的列必须命名
  • excel就是一个数据框的结构

data.frame():制作数据框

索引会出现行名列名

索引方式与上边类似

  • 使用lm进行线性回归时只需要给出列名即可
  • attach:加载数据框,这样就可以不用$符号来加载数据,即可以直接输入列名来得到数据
  • detach:取消加载,执行后就需要带上数据框名$列名才能得到数据
  • with(mtcars,(hp)):也起到相同效果,第一个元素是数据框名字,第二个是列名

2.7 因子 factor

  • 变量分类(可能值称为一个水平 level
    • 名义型变量:相互独立,没有顺序
    • 有序型变量
    • 连续型变量:连续的关系
  • 名义型变量和有序型变量被称为因子,factor,这些分类变量的可能值称为一个水平level,例如good,better,best,都成为一个level,由这些水平值构成的向量就称为因子
    • 作用:适合用于记录某项研究中研究对象满足的不同处理水平或者其他类型的分类变量
      • 最大作用是用来分类,计算频数和频率
    • 应用
      • 计算频数、独立性检验、相关性检验、方差分析、主成分分析、因子分析等等
    • 在很多绘图工具都是要使用到因子
table() 分类统计因子中含有的level
cut() 分割函数

2.8 时间序列(time series)

  • 时间序列分析
    • 用来预测

时间序列的处理

ts():生成时间序列

3.缺失数据

  • NA表示缺失值,不可用(not available),存储缺失信息,不一定就是0,缺失值和值为0是完全不同的
  • 当向量中有NA时求sum结果时NA,此时需要sum(向量,na.rm=TRUE)
is.na(a) 检查a中是否有NA,有就返回TRUE,可以用来测试数据集
colSums() 检测缺失值数目
oa.omit() 去掉向量中的NA值

处理缺失值包

识别缺失值

  • 删除缺失值
    • 无效实例(行删除)omit.na()
    • 有效实例(配对删除法) 一些函数有可用选项
  • 最大似然估计mvmle包
  • 插补缺失值
    • 单个插补(简单) Hmisc包
    • 多重插补MI包、Mice包、amelia包、mitools包

其他缺失数据

  1. 缺失数据NaN,代表不可能的值

  2. Inf表示无穷,分为正无穷Inf和负无穷Inf,代表无穷大或者无穷小

也是使用is.na()检查缺失值,返回TRUE和FALSE

4. 字符串

处理字符串的函数(R语言中字符串也满足正则表达式,可以使用正则表达式)

nchar() 返回向量元素中字符串的长度(包含空格),就算元素不是字符串也会转换成字符串来处理
length() 返回向量元素个数
paste() 粘贴字符串,后边元素加个sep="-"表示用-连接,当一个向量有多个字符串时是在各个元素后分别添加
substr() 提取字符,可以提取每个字符串元素的start到stop
toupper / tolower 将字符串转换为大写 / 小写
gsub() 首字母大小写转换
strsplit() 分割字符串

5.获取数据

5.1 利用键盘获取数据

> patientID <- c(1, 2, 3, 4)
> admdate <- c("10/15/2009","11/01/2009","10/21/2009","10/28/2009")
> age <- c(25, 34, 28, 52)
> diabetes <- c("Type1", "Type2", "Type1", "Type1")
> status <- c("Poor", "Improved", "Excellent", "Poor")
> data <- data.frame(patientID,age,diabetes,status)
> data
  patientID age diabetes    status
1         1  25    Type1      Poor
2         2  34    Type2  Improved
3         3  28    Type1 Excellent
4         4  52    Type1      Poor

> data2 <- data.frame(patientID=character(0),admdate=character(0),age=numeric(),diabetes=character(),status=character())
> data2 <- edit(data2)  #输入这个会弹出一个方框可以修改数据,未定义的数据就是NA,一定要像这样找个变量保存,不然编辑器中修改的数据无法保存
> data2
  patientID admdate age diabetes status
1         5      NA        
2         6      NA        
3         7      NA        
4         5      NA        

#也可以使用fix函数,可以直接保存

5.2 通过读取存储在外部文件上的数据

5.3 通过访问数据库系统来获取数据

6.读取文件

6.1 read.table()

  • 将文件放在工作空间目录下
  • 使用read.table(“文件名”),保存到一个变量中
  • 注:一般是用来读取txt换个csv文件
    • 可以使用head()和tail()两个函数来查看前几行和最后几行
    • 可以使用全路径
    • sep设置文件使用了什么分隔符,txt默认是空格,csv文件则要设置sep=","
    • header=TRUE,表示第一行数据作为标题而不是数据
    • skip设置跳过某些内容,设置skip=5,表示从第六行读取数据
    • nrows=100,表示读取到一百行,可以与skip搭配使用
    • na.string:处理缺失值信息,如果已知使用了什么符号作为缺失值,那么可以将缺失值替换为NA
    • stringAsFactors:控制字符串是否转换为因子(一般设置为FALSE)
  • 可以读取剪切板上的数据
    • 在excel中选取某一部分,read.table(“clipboard”,header =T,sep="\t")
    • 也可以直接使用readClipboard()来读取剪切板上的信息

6.2 read.csv()

6.3 read.delim()

  • 其他read函数是read.table的简化版本,默认的分割形式不一样

6.4 读取网络文件

  • 可以是csv,txt文本文件,遵循html等协议
  • 不过容易出问题,爬虫吧

6.5 压缩文件

  • 可以直接读取
> read.table(gzfile("input.txt.gz"))

6.6 读取不规范文件

  • readLine()
    • 可以根据每一行、每个单元来读取文件
    • 设置参数n限制读入行数
  • scan()
    • 每次读取一个单元
    • 第一个参数表示文件地址
    • what:期望读入的单元

7.写入文件

7.1 write.table()

  • 默认保存在工作空间目录下,路径必须存在,R文件不会创建新的目录
  • 可以指定新的分隔符,保存成不同类型的文件
  • 写入文件时会把行号也写进去,可以添加参数row.names=FALSE取消将行号写入,如果行号是自带的可以使用负索引将行号去除掉
  • 默认会给字符串添加双引号,可以将quote设置为FALSE去除
  • na调整缺失值
  • 同名文件会覆盖,可以将参数append设置为TRUE,设置为追加写入
  • 可以直接写成压缩文件,文件扩展名也要对应上
  • 想要将R的结果写成其他软件支持的格式可以使用foreign包

8. 读写excel文件

  • 如果excel文件中包含了很多宏就不太适合直接读取
  • openxlsx仅适用于打开xlsx文件
install.packages(openxlsx)
library(openxlsx)
a<-read.xlsx("exercise1.xlsx",sheet=1)#文件名+sheet的序号,简单粗暴

写入xlsx文件

#将文件内容写入变量a中
> a <- read.xlsx("data.xlsx")

> library(openxlsx)
> write.xlsx(a,file = "c.xlsx",sheetName = "she")

9.读写R格式文件

  • 保存数据集,R会对存储为内部文件格式的数据进行自动压缩处理,并且会存储所有与带存储对象相关的R元数据
  • 如果数据中包含了因子,日期和时间或者类的属性等信息就体现了作用

RDS文件

  • 只能存储单一变量
案例中使用了软件自带数据集iris
> saveRDS(iris,file = "iris.RDS")
> iris <- readRDS("E:/mathmodel/R_studio/RS_project/iris.RDS") #双击打开RDS文件自动导入
> x <- readRDS("iris.RDS")

RData文件

  • 保存多个类型变量,类似于工程文件
  • 保存了包、文件、信息等数据
save.image() 保存工作空间
load 加载工作空间

10.数据转换

  • 转换成函数成处理的数据
  • as.data.frame可以强制转换为数据框格式
  • 矩阵可以直接转换为数据框,而数据框不能直接转换为矩阵,因为含有不同类型的数据

10.1 取子集

方法一

> who <- read.csv("WHO.csv")
> who1 <- who[c(1:50),c(1:10)]
> View(who1)

> who4 <- who[which(who$CountryID>50 &who$CountryID<=100),]#注意逗号

方法二

> who5 <- subset(who,who$CountryID>50 & who$CountryID<=100)

随机抽样

> x <- 1:20
> sample(x,10)#replace参数默认为F,无重复抽样
 [1] 13  5 11  1 17  4  8 20  6 12
 
 > who7 <- who[sort(sample(who$CountryID,30,replace = F)),]

10.2 删除固定行

使用了自带数据集mtcars

mtcars[-1:-5,] #删除固定行
mtcars[,-1:-5] #删除固定列

10.3 数据框的合并

cbind(两个数据集)  #添加一列
rbind(两个数据集)  #添加一行 要求两个数据集要有相同的列名

当有重叠时不会删除重复项

duplicated(数据集)  #判断行名是否有重复值,返回T和F
data4[duplicated(data4),]  #取出重复部分
data4[!duplicated(data4),]  #取出非重复部分

也可以直接unique()函数一步到位
unique(data4)

10.4 数据翻转

T()函数

  • 可以直接实现行列翻转

rev()函数

  • 翻转一行
  • 可用于数据框和向量

transform()函数

  • 直接修改某一列的值
transform(women,height=height*2.54) #这样women数据集中的height列就变成了原来的2.54倍

10.5 数据框的排序

  • sort只能用于向量的排序,不能用于数据框
  • order函数也可以对向量排序,但返回的是索引而不是排序后的向量
    • 如果要取相反顺序那么在order前加上-号即可,就是rev函数的效果
    • 也可以同时对多个进行排序

10.6 数据框计算(apply系列函数)

巧妙之处在于FUN这个参数

apply()

  • 适用于数据框或者矩阵

  • MARGIN=1对行操作 ,=2对列操作

  • FUN:所使用的函数

分组计算

  • tapply()
    • 参数:vector
    • 返回值:vector
  • apply()
    • 参数:list,data,frame,array
    • 返回值:vector,matrix

多参数计算

  • mapply()
    • 参数:vector,不限个数
    • 返回值:vector,matrix

循环迭代

  • lapply()
    • 参数:list,data,frame
    • 返回值:list
  • 简化版:sapply()
    • 可设置返回值vapply()
    • 向量或者矩阵
  • 递归版:rapply()
    • 参数:list
    • 返回值:list

环境空间遍历

  • eapply()
    • 参数:environment
    • 返回值:list
> state.name
 [1] "Alabama"        "Alaska"         "Arizona"        "Arkansas"      
 [5] "California"     "Colorado"       "Connecticut"    "Delaware"      
 [9] "Florida"        "Georgia"        "Hawaii"         "Idaho"         
[13] "Illinois"       "Indiana"        "Iowa"           "Kansas"        
[17] "Kentucky"       "Louisiana"      "Maine"          "Maryland"      
[21] "Massachusetts"  "Michigan"       "Minnesota"      "Mississippi"   
[25] "Missouri"       "Montana"        "Nebraska"       "Nevada"        
[29] "New Hampshire"  "New Jersey"     "New Mexico"     "New York"      
[33] "North Carolina" "North Dakota"   "Ohio"           "Oklahoma"      
[37] "Oregon"         "Pennsylvania"   "Rhode Island"   "South Carolina"
[41] "South Dakota"   "Tennessee"      "Texas"          "Utah"          
[45] "Vermont"        "Virginia"       "Washington"     "West Virginia" 
[49] "Wisconsin"      "Wyoming"    

> state.division
 [1] East South Central Pacific            Mountain           West South Central
 [5] Pacific            Mountain           New England        South Atlantic    
 [9] South Atlantic     South Atlantic     Pacific            Mountain          
[13] East North Central East North Central West North Central West North Central
[17] East South Central West South Central New England        South Atlantic    
[21] New England        East North Central West North Central East South Central
[25] West North Central Mountain           West North Central Mountain          
[29] New England        Middle Atlantic    Mountain           Middle Atlantic   
[33] South Atlantic     West North Central East North Central West South Central
[37] Pacific            Middle Atlantic    New England        South Atlantic    
[41] West North Central East South Central West South Central Mountain          
[45] New England        South Atlantic     Pacific            South Atlantic    
[49] East North Central Mountain          
9 Levels: New England Middle Atlantic South Atlantic ... Pacific


> tapply(state.name,state.division,FUN=length) #操作的是因子
       New England    Middle Atlantic     South Atlantic East South Central 
                 6                  3                  8                  4 
West South Central East North Central West North Central           Mountain 
                 4                  5                  7                  8 
           Pacific 
                 5 

10.7 数据的中心化与标准化

数据中心化:指数据集中的给想数据减去数据集的均值

数据标准化:指在中心化之后再除以数据集的标准差

scale()函数

  • 参数
    • x
    • center:中心化
    • scale:标准化

10.8 reshape2包

  • 先将数据融合,再取特定的列作为标志重新排序为一列
> library(reshape2)
> head(airquality)
> names(airquality) <- tolower(names(airquality))
> head(airquality)
> aql <- melt(airquality)
> head(aql)

> head(airquality)
  ozone solar.r wind temp month day
  
> aql <- melt(airquality,id.vars=c("month","day"))
> aql
    month day variable value
  • acast()
  • dcast()

10.9 tidyr包

  • 特点:较为简洁

  • 每一列表示一个变量

  • 每一行表示一个观测

  • 一个变量和一个观测确定唯一值

gather()

  • 收集成单列,按照key和value将想要的数据排成两列

spread()

  • 与gather相反

unite():多列合并为一列

  • 与seperate相反

separate():一列分开为多列

  • col=x 要操作的列名
  • into=c(“A”,“B”):拆分后的列名
  • seq:设置分隔符

10.10 dplyr包

  • 可以操作单表格、也可以操作双表格
  • 调用时要用双冒号,放置于同名函数发生歧义
dplyr::distinct() 去除重复行叠加
dplyr::filter() 匹配项,使用布尔运算去除一些数值
dplyr::slice() 切片,取出任意行
sample_n(数据集,10) 随机抽取10行
sample_frac(数据集,0.1) 按照0.1比例进行随机抽取
arrange 排序(如果加上desc则是按照相反的顺序进行排序
  • select()函数取子集
    • 根据列名、或者字符开头或结尾来取

10.11 链式操作符%>%

  • 实现将一个函数的输出传递给下一个函数,作为下一个函数的输入
  • 可以使用多个链式操作符来内容传递

11. R函数

  • 选项参数
    • 输入控制部分
    • 输出控制部分
    • 调节部分
  • 常用选项
    • file:接一个文件
    • data:一般指要输入一个数据框
    • x:表示单独的一个对象,一般都是向量,也可以是矩阵或者列表
    • x和y:函数需要两个输入变量
    • x,y,z:函数需要三个输入变量
    • formula:公式
    • na.rm:删除缺失值
    • …:表示与其他函数类似
  • 调节参数
    • main:字符串,不能是向量
    • na.rm:TRUE或者FALSE
    • axis:side参数只能是1到4(确定图形区域的位置)
    • fig:包含四个元素的向量

12. 数据统计函数

12.1 函数

d 概率密度函数
p 分布函数
q 分布函数的反函数
r 产生相同分布的随机

给正态分布normal前加上dpqr前缀就构成函数名

  • rNormal:正态分布的随机数函数

  • 其他概率分布函数也是如此

  • 了解分布就可以绘制出各种曲线

分布名称 缩写 分布名称 缩写
Beta分布 beta Logistic分布 logis
二项分布 binom 多项分布 multinom
柯西分布 cauchy 负二项分布 nbinom
(非中心)卡方分布 chisq 正态分布 norm
指数分布 exp 泊松分布 pois
F分布 f Wilcoxon符号秩分布 signrank
Gamma分布 gamma t分布 t
几何分布 geom 均匀分布 unif
超几何分布 hyper Weibull分布 weibull
对数正态分布 lnorm Wilcoxon秩和分布 wilcox

12.2 生成随机数runif()

  • 默认生成0到1的数

  • 可以调节参数min和max

  • 如果想要两次生成的随机数相同,可以

    • set.seed(66)#一个绑定号码
      runif(50)
      
      runif(50) #这里生成的随机数与前边不同
      
      set.seed(66)
      runif(50)#这里生成的随机数与前边相同
      

12.3 描述性统计函数

summary()

  • 可以对数据集进行统计

fivenum()

  • 同summary

aggregate()

  • 统计函数,按照自己设定的信息对某些数值进行分组
  • 一次只能通过一个函数来计算,返回一个函数值

summaryBy()

  • 一次完成多个分组,多个统计函数,结果展现在一个表格内

13. 频数统计函数

13.1 table()

  • 可以直接完成对频数的统计
  • 或者也可以将列名设置成因子,用split函数进行分割,按照不同的数值分成不同的数据框
  • 可以完成一维或者二维的统计

13.2 xtabs()

  • addmargins()
    • 添加到列联表的行或者列中
    • 第二个参数 1表示行 2表示列
  • ftabs()函数可以将结果转换为评估式的列联表

14. 独立性检验函数

  • P值

    • 假设检验
      • 原假设——没有发生; 备择假设——发生了
    • P值是一个通过计算得到的概率值,也就是在原假设为真时,得到最大的或者超出所得到的检验统计量值的概率,
    • 一般将P值定位到0.05,当p<0.05时拒绝原假设,p>0.05不拒绝原假设

14.1 卡方检验

> library(vcd)
> mytable <- table(Arthritis$Treatment,Arthritis$Improved)
> mytable
         
          None Some Marked
  Placebo   29    7      7
  Treated   13    7     21
> chisq.test(mytable)

	Pearson's Chi-squared test

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

> mytable <- table(Arthritis$Sex,Arthritis$Improved)
> chisq.test(mytable)

	Pearson's Chi-squared test

data:  mytable
X-squared = 4.8407, df = 2, p-value = 0.08889

Warning message:
In chisq.test(mytable) : Chi-squared approximation may be incorrect

14.2 Fisher检验

  • 边界固定的列联表中行和列是固定的
> mytable <- xtabs(~Treatment+Improved,data=Arthritis)
> fisher.test(mytable)

	Fisher's Exact Test for Count Data

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

14.3 Cochran-Mantel-Haenszel检验

  • 两个名义变量在第三个变量中都是独立的(需要三个变量,变量顺序对结果有影响
> mytable <- xtabs(~Treatment+Improved+Sex,data=Arthritis)
> mantelhaen.test(mytable)

	Cochran-Mantel-Haenszel test

data:  mytable
Cochran-Mantel-Haenszel M^2 = 14.632, df = 2, p-value = 0.0006647

> mytable <- xtabs(~Sex+Treatment+Improved,data=Arthritis)
> mantelhaen.test(mytable)

	Mantel-Haenszel chi-squared test with continuity correction

data:  mytable
Mantel-Haenszel X-squared = 2.0863, df = 1, p-value = 0.1486
alternative hypothesis: true common odds ratio is not equal to 1
95 percent confidence interval:
 0.8566711 8.0070521
sample estimates:
common odds ratio 
         2.619048 

15. 相关性函数

  • 通过量化指标来衡量相关性

15.1 相关性分析函数

cor()

  • 相关性分析都是使用这个函数
  • 可以计算pearson(默认)、kendall和spearman三个相关系数,其他系数只能R的扩展包(ggm)实现
  • 可以取单独几列进行比较

cov()

  • 计算协方差
    • 衡量两个变量的总体误差
    • 反映的问题与cor()差不多

ggm包

  • pcor(u,s)函数用来计算偏相关系数

  • u是一个数值向量,前两个数值表示要计算相关系数的变量下标,其余数值为条件变量的下标

    jsbl <- c(1,5) #要计算的相关系数的变量下标

    tjbl <- c(2,3,6) #条件(控制)变量的下标,即要排除影响的变量的下标

    u <- c(jsbl,tjbl)

  • s <- cov(pcordata) #变量的协方差

  • r <- pcor(u,s) #偏相关系数

15.2 相关性检验函数

  • 分析后还是需要量化成P值来检验

cor.test()

  • 可以计算pearson(默认)、kendall和spearman三个相关系数,其他系数只能R的扩展包(ggm)实现
> cor.test(state.x77[,3],state.x77[,5])

	Pearson's product-moment correlation

data:  state.x77[, 3] and state.x77[, 5]
t = 6.8479, df = 48, p-value = 1.258e-08
alternative hypothesis: true correlation is not equal to 0

#置信区间:由样本统计量所构造的总体参数的估计区间,在统计学中一个概率样本的置信区间是对这个样本的某个总体参数的区间估计,置信区间展现的是这个参数的真实值由一定概率落在测量结果的周围的程度,置信区间给出的是被测量参数的测量值的可信程度
95 percent confidence interval: #置信区间
 0.5279280 0.8207295
sample estimates:
      cor 
0.7029752 

corr.test()

  • 在psych包中,可以递归处理
  • 计算了相关系数还给出了检测值

pcor.test()

  • 偏相关检验
  • 参数
    • 偏相关系数
    • 变量数
    • 样本数
  • 返回值
    • 学生T检验
    • 自由度
    • P值

分组数据相关性检验

  • T检验
    • 比较两个平均数差异是否显著
    • 主要用于含量较小(小于30个),总体标准差未知的正态分布数据

参数检验

  • 在总体分布形式已知(即数据分布已知,例如满足正态分布)的情况下,对总体分布的参数如均值、方差等进行推断的方法

非参数检验

  • 在总体方差未知或知道甚少的情况下,利用样本数据对总体分布形态等进行推断的方法。由于非参数检验方法在推断过程中不涉及有关总体分布的参数,因而称为非参数检验

16. 绘图函数

R语言四大作图系统

  • 基础绘图系统
  • lattice包
  • ggplot2包
  • grid包

plot()

  • 支持多种数据类型

par()

设置字体样式,颜色等参数

17.自定义函数

函数声明

myfun <- function(选项参数)
	{
		函数体
			}

18.数据分析实战

18.1 线性回归

  • lm函数输入必须是数据框的格式
  • 回归regression:指那些用一个或多个预测变量,也称自变量或解释变量,来预测响应变量,也称为因变量、校标变量或结果变量的方法

> fit <- lm(weight ~ height,data = women)
> fit

Call:
lm(formula = weight ~ height, data = women)

Coefficients:
(Intercept)       height  
     -87.52         3.45  

> summary(fit)

Call:
lm(formula = weight ~ height, data = women)

Residuals:   #残差:真实值与预测值的差  下边是残差分布,残差值越小越精确
    Min      1Q  Median      3Q     Max 
-1.7333 -1.1333 -0.3833  0.7417  3.1167 

Coefficients:  #检验  weight = 3.45height -87.52
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -87.51667    5.93694  -14.74 1.71e-09 ***   #截距项
height        3.45000    0.09114   37.85 1.09e-14 ***   #系数
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1  #星星评定标准

Residual standard error: 1.525 on 13 degrees of freedom  #残差标准误差
Multiple R-squared:  0.991,	Adjusted R-squared:  0.9903   #R方判定系数 (0~1) 判断模型拟合质量  99.1%表示模型能表示99.1%的数据
F-statistic:  1433 on 1 and 13 DF,  p-value: 1.091e-14   #F统计量,表示模型是否显著,用P值来衡量,p越小越显著

#判断模型顺序:从下到上
#先判断F,如果不小于0.05那么模型没有价值了,小于0.05再看R方
  • 对拟合线性模型非常有用的其他函数
summary 展示拟合模型的详细结果
coefficients 列出拟合模型的模型参数(截距项和斜率
confint 提供模型参数的置信区间
fitted 列出拟合模型的预测值
residuals 列出拟合模型的残差值
anova 生成一个拟合模型的方差分析表,或者比较两个或更多拟合模型的方差分析表
vcov 列出模型参数的协方差矩阵
AIC 输出赤池信息统计量
plot 生成评价拟合模型的诊断图
predict 用拟合模型对新的数据集预测响应变量值
#接上边
> plot(women$height,women$weight)
> abline(fit)
#拟合后生成曲线

#提高拟合度
> fit2 <- lm(weight ~ height+I(height^2),data = women) #增加一次,如果要三次就得再加I(height^3)
> lines(women$weight,fitted(fit2),col="red")  #颜色区分

18.2 多元线性回归

> states <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
> class(states)
[1] "data.frame"
> fit <- lm(Murder~Population+Illiteracy+Income+Frost,data=states)
> fit

Call:
lm(formula = Murder ~ Population + Illiteracy + Income + Frost, 
    data = states)

Coefficients:
(Intercept)   Population   Illiteracy       Income        Frost  
  1.235e+00    2.237e-04    4.143e+00    6.442e-05    5.813e-04  
  
> summary(fit)

Call:
lm(formula = Murder ~ Population + Illiteracy + Income + Frost, 
    data = states)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.7960 -1.6495 -0.0811  1.4815  7.6210 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 1.235e+00  3.866e+00   0.319   0.7510    
Population  2.237e-04  9.052e-05   2.471   0.0173 *  
Illiteracy  4.143e+00  8.744e-01   4.738 2.19e-05 ***
Income      6.442e-05  6.837e-04   0.094   0.9253    
Frost       5.813e-04  1.005e-02   0.058   0.9541    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.535 on 45 degrees of freedom
Multiple R-squared:  0.567,	Adjusted R-squared:  0.5285 
F-statistic: 14.73 on 4 and 45 DF,  p-value: 9.133e-08

> options(digits = 4)
> coef(fit)
(Intercept)  Population  Illiteracy      Income       Frost 
  1.235e+00   2.237e-04   4.143e+00   6.442e-05   5.813e-04 

判断变量关系(AIC函数)

  • 多个变量时,要注意变量两两之间的关系,不确定两个变量的关系可以用冒号,如下

  • > fit <- lm(mpg~hp+wt+hp:wt,data=mtcars)  #这两个变量由交互关系,但时不清楚是什么关系,那么可以用冒号连接
    > summary(fit)
    
    Call:
    lm(formula = mpg ~ hp + wt + hp:wt, data = mtcars)
    
    Residuals:
       Min     1Q Median     3Q    Max 
    -3.063 -1.649 -0.736  1.421  4.551 
    
    Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
    (Intercept) 49.80842    3.60516   13.82  5.0e-14 ***
    hp          -0.12010    0.02470   -4.86  4.0e-05 ***
    wt          -8.21662    1.26971   -6.47  5.2e-07 ***
    hp:wt        0.02785    0.00742    3.75  0.00081 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 2.15 on 28 degrees of freedom
    Multiple R-squared:  0.885,	Adjusted R-squared:  0.872 
    F-statistic: 71.7 on 3 and 28 DF,  p-value: 2.98e-13
    
  • 赤池信息准则

    • 考虑了模型的拟合度和用来拟合的参数数目
    • 计算得到的AIC越小越好,表示可以用越少的变量来表达模型的拟合度
    • 参数较多,判断时可以使用逐步回归法和全子集回归法
      • 逐步回归法:每次减少 / 增加一个变量直到数值不变(mars包中的stepAIC()函数)
        • 减少:向后逐步回归
        • 增加:向前逐步回归
      • 全子集回归法(leaps包中的regsbusets()函数)
        • 取所有模型计算出最佳模型
        • 但是如果变量过多需要的时间更长
  • 拟合效果最佳但是没有实际意义也是没有用的

18.3 回归诊断

  • 诊断问题

    • 这个模型是否是最佳模型
    • 模型多大程度满足OLS模型的统计假设
    • 模型是否经得起更多数据的检验
    • 如果拟合出来的模型指标不好,该如何继续下去
    • ……
  • 检验统一假设的方法

    • summary():生成各项指标

    • plot():输入lm分析后的数值产生四幅图

    • > opar <- par(no.readonly = TRUE)
      > fit <- lm(weight~height,data=women)
      > par(mfrow=c(2,2))  #设置四个图显示在一个画面内
      > plot(fit)
      
  • 满足OLS(最小二乘法)模型统计假设的条件才可以用lm()函数进行拟合,但是四个图并不能拿来判断独立性

    1. 正态性:对于固定的自变量值,因变量值成正态分布
    2. 独立性:因变量之间相互独立
    3. 线性:因变量与自变量之间为线性相关(直线、曲线)
    4. 同方差性:因变量的方差不随自变量的水平不同而变化,也可称作不变方差
  • 抽样法验证模型

    1. 数据集中有1000个样本,随机抽取500个数据进行回归分析
    2. 模型建好吼,利用predict函数,对剩余500个样本进行预测,比较残差值
    3. 如果预测准确,说明模型,否则需要调整模型

18.4 方差分析

  • 用于两个及两个以上样本均数差别的显著性检验。方差分析也是回归分析的一种,只不过线性回归的因变量一般是连续性变量,而当自变量是因子时,研究关注的重点通常会从预测转不同组之间差异的比较。
  • aov()函数来进行分析(变量顺序很重要)

设计 表达式
单因素ANOVA y~A
含单个协变量的单因素ANCOVA y~x+A
双因素ANOVA y~A*B
含两个协变量的双因素ANCOVA y~x1+x2+A*B
随机化区组 y~B+A(B是区组因子)
单因素组内ANOVE y~A+Error(Subject/A)
含单个组内因子(W)和单个组间因子(B)的重复测量ANOVA y~B*W+Error(Subject/W)

18.5 功效分析

  • 回归分析和方差分析都可以拿来建模和判断数据之间的关系
  • 可以办证过户在给定置信度的情况下判断检测到给定效应值时所需的样本量,反过来它也可以在给定置信度水平情况下,计算在某样本量内能检测到给定效应值的概率

理论基础(给出其中三个可以推出第四个)

  1. 样本大小指的是实验设计中每种条件 / 组中观测的数目
  2. 显著性水平(也称alpha),由Ⅰ型错误的概率来定义,也可以把它看做时发现效应不发生的概率
  3. 功效通过Ⅰ减去Ⅱ型错误的概率来定义,可以把它看作是真实效应发生的概率
  4. 效应值指的是在备择或研究假设下效应的量,效应值的表达式依赖于假设检验中使用的统计方法

线性回归功效分析案例

  • 使用R中的“pwr”包

18.6 广义线性模型

  • 模型类型较多,线性回归和方差分析都是基于正态分布的假设,广义线性模型扩展了线性模型的框架,它包含了非正态因变量的分析

glm()函数

  • 与lm()类似,但多了参数:概率分布family和相应默认的连接函数link
  • 推导依据是极大似然法估计

泊松回归

  • 用来为计数资料和列联表建模的一种回归分析,泊松回归假设因变量是泊松分布,并假设它的平均值的对数可被未知参数的线性组合建模

Logistic回归

  • 当通过一系列连续性或类别型预测变量来预测二值型结果变量时是一个非常有用的工具

18.7 主成分分析 / 因子分析

主成分分析

  • 与因子分析都是用来简化多变量复杂关系的监测方法
  • 一种数据降维技巧,将大量相关变量转化为一组很少的不相关变量,这些无关的变量称为主成分,主成分其实是对原始变量重新进行线性组合,将原先众多具有一定相关性的指标重新组合为一组新的相互独立的综合指标
  • princomp()函数或者psych包中的函数principal()

因子分析

  • 一系列用来发现一组变量的潜在结构的方法,通过寻找一组更小的、潜在的或隐藏的结构来解释已观测到的、显式的变量间的关系,是主成分的推广
  • 比主成分分析难在找公共因子,并对其进行表述和解释

主成分分析与因子分析的步骤

  1. 数据预处理
  2. 选择分析模型
  3. 判断要选择的主成分 / 因子数目(用碎石图来分析:fa.parallel()函数)
  4. 选择主成分 / 因子
  5. 旋转主成分 / 因子(可选的)
  6. 解释结果
  7. 计算主成分或因子得分,这步也是可选的

你可能感兴趣的:(数模,r语言)