1.R的使用
1.3.基础命令
|
---|
函数 | 说明 |
---|
example(‘foo’) | 查看函数示例 |
data() | 查看已加载可用的数据集 |
vignette(‘foo’) | 查看主题为foo可用的vignette文档 |
getwd() | 显示当前工作目录 |
setwd() | 修改工作目录 |
ls() | 显示工作空间的对象 |
rm(list=ls()) | 删除全部的对象 |
options() | 显示或设置当前选项 |
history(n) | 显示最近的n个命令 |
save.image(‘myfile’) | 保存工作空间到myfile中,默认是.RData |
load(‘myfile’) | 读取一个工作空间到当前会话 |
source(‘file_name’) | 在当前会话中执行一个脚本 |
sink(‘file_name’) | 重定向输出到文件,append是否追加,split=T则同时输出到屏幕和文件中 |
object.size(x)/1000000 | 查看变量占用的内存空间,M |
srirage.mode(x) | 改变变量的存储类型 |
storage.mode(x) <- “integer” | 改为整数型,可以看到该对象的大小会变为原来的一半 |
memory.size() | 查看现在的work space的内存使用 |
memory.limit() | 查看系统规定的内存使用上限,注意,在32位的R中,封顶上限为4G,无法在一个程序上使用超过4G (数位上限)。这种时候,可以考虑使用64位的版本 |
rm(object) | 删除变量 |
gc() | 做Garbage collection,否则内存是不会自动释放的,相当于你没做rm. |
rm(list=ls()) | 删除全部变量 |
图像输出pdf(‘filename.pdf’) #重定向到图像输出
png(‘filename.png’)
jpeg(‘filename.jpeg’)
dev.off() #将输出返回到终端
2.数据结构
2.2.2.矩阵
matrix(vector, nrow=n, ncol=m, byrow=TRUE, dianames=list(rname, cname))
2.2.4.数据框
数据框绑定
attach()
detach()
with()
[code]attach(mtcars)plot(mpg, wt)mpgdetach(mtcars)with(mtcars, { summary(mpg, disp, wt) plot(mpg, disp) plot(mpg, wt)})
2.2.6.列表的引用
list[]
4.数据管理
1.data.frame(col1,col2…,stringAsFactors=FALSE)
创建数据框的时候,不要将字符串转成因子
2.创建新变量
[code]mydata = transform(mydata, sumx = x1+x2, meanx = (x1+x2)/2)library(dplyr)mutate(mydata, sumx = x1+x2, meanx = (x1+x2)/2)
4.3.变量重编码
!x:非x
x|y:或
x&y:与,和
isTRUE(x):测试x是否为true
[code]mydata$age[mydata$age == 99] <-NAmydata$agecat[mydata$age >=55 & mydata$age <=75] <- 'middle aged'mydata = with(mydata, { agecat <- NA agecat[age>75] <-'elder' agecat[age>=55 & age <=75] <- 'middle aged' agecat[age<55] <- 'young' })#epicalc包的recode函数#看看有哪些因子水平,或者说不重复的取值list = unique(data3$arpu)#构建 old 列表old <- c("(50,80)","(10,20]","0","(20,50]","(0,5]","(100,150]","(150,200]","(200,300]","(5,10]","[80,100]","300以上" )#构建 new 列表new <- c("低值","低值","低值","低值","低值","高值","高值","高值","低值","高值","高值")library(epicalc)recode(vars = "arpu",old,new,dataframe)#recode 函数其实是用new替换原来的old,所以建议先复制一列,然后在复制的列上进行 recode 操作#R的cut函数aaa <- c(1,2,3,4,5,2,3,4,5,6,7)cut(aaa, 3, dig.lab = 4, ordered = TRUE)
4.4.变量重命名
[code]#1fit(mydata) #交互式修改`#2library(reshape)mydata = rename(mydata, c(old_name1 = 'new_name1', old_name2 = 'new_name2',...))#3names(mydata)[2]='new_name'
4.5.缺失值
删除含有缺失值的行
na.omit(mydata)
4.6.日期
|
---|
符号 | 含义 | 示例 |
---|
%d | 01-31天 | |
%a | 缩写的星期 | Mon |
%A | 非缩写的星期 | Monday |
%m | 月份 | 00-12 |
%b | 缩写的月份 | Jan |
%B | 非缩写的月份 | January |
%y | 两位数的年份 | 07 |
%Y | 4位数的年份 | 2007 |
[code]as.Data(c('2007-06-22','2004-02-13'))#系统日期Sys.Date()date()format(Sys.Date(), format='%Y%m%d')#日期加减end_date - start_datediff(today, that_day, units='weeks')#lubridate包
4.8.排序
[code]mydata = mydata[order[mydata$age),]attach(mydata)newdata = mydata[order(gender, -age),]detach(mydata)
4.9.合并数据集
[code]# merge,一种内连接,innder jointotal = merge(data1, data2, by=c('id','country'))rbind()cbind()
4.10.子集
[code]mydata[, c(6:10)]mydata[, c(var1,var2,...)]#丢弃变量vars = names(mydata) %in% c('q3','q4')mydata[!vars]mydata[c(-8,-9)]#删除变量mydata$q4 <- NULL
4.10.进入观测
[code]mydata = mydata[,1:3]mydata[ which(mydata$gender == 'M' & mydata$age>30),]attach(mydata)mydata[which(gender == 'M' & age>30),]detach(mydata)
[code]subset(mydata,age>=35 | age<24, select=c(q1,q2,q3,q4))subset(mydata, gender =='M' & age >25, select =gender:q4)
4.11.随机抽样
[code]# 无放回随机抽样,抽10个样本mydata[sample(1:nrow(mydata),10, replace=FALSE), ]
4.12.sql语句
[code]library(sqldf)newdata = sqldf('select * from mydata where carb=1 order by mpg', row.names=TRUE)new_data = sqldf('select avg(mpg), avg(disp) as avg_disp, gear from mtcars where cyl in (4,6) group by gear')
5.高级数据管理
5.2.数值与字符处理函数
5.2.1.数学函数
|
---|
函数 | 描述 |
---|
abs(x) | 绝对值 |
sqrt(x) | 平方根 |
x^2 | 平方 |
ceiling(x) | 向上取整 |
floor(x) | 向下取整 |
trunc(x) | 向零取整 |
round(x, digits=n) | 直接截断保留n位小数 |
signif(x) | 四舍五入保留n位小数 |
cos(x),sin(x),tan(x) | 余弦,正弦,正切 |
acos(x),asin(x),atan(x) | 反余弦,反正弦,反正切 |
cosh(x),sinh(x),tanh(x) | 双曲余弦,双曲正弦,双曲正切 |
acosh(x),asinh(x),atanh(x) | 反双曲余弦,反双曲正弦,反双曲正切 |
log(x,base=n) | n为底的对数,log(x)为自然对数,log10(x)为10常用对数 |
exp(x) | 指数 |
5.2.2.统计函数
|
---|
函数 | 描述 |
---|
mean(x) | 平均数 |
median(x) | 中位数 |
sd(x) | 标准差 |
var(x) | 方差 |
mad(x) | 绝对中位差 |
quantile(x,probs=c(0.3,0.84)) | 分位数 |
range(x) | 范围 |
sum(x) | 求和 |
diff(x,lag=n) | 滞后差分 |
min(x),max(x) | 最小最大值 |
scale(x,center=T, scale=T) | 中心化(center=T)或标准化(center=T, scale=T) |
其他均值和方差的标准化
scale(mydata)*sd+mean
5.2.3.概率函数
d=密度函数
p=分布函数
q=分位数函数
r=生产随机数(随机偏差)
|
---|
分布名称 | 缩写 | 分布名称 | 缩写 |
---|
正态分布 | norm | 非中心卡方分布 | chisq |
Beta分布 | beta | logistic分布 | logis |
二项分布 | binom | 多项分布 | multinom |
柯西分布 | cauchy | 负二项分布 | nbinom |
指数分布 | exp | 泊松分布 | pois |
F分布 | f | Wilcoxon符号秩分布 | signrank |
Gamma分布 | gamma | t分布 | t |
几何分布 | geom | 均匀分布 | unif |
超几何分布 | hyper | Weibull分布 | weibull |
对数正态分布 | lnorm | Wilcoxon秩和分布 | wilcox |
设定随机数种子
set.seed(1234)
5.2.4.字符串处理函
|
---|
函数 | 描述 |
---|
nchar(x) | x的字符数量,注意和length(x)的区别 |
substr(x,start,stop) | 提取或替换子字符串,substr(‘abcde’,2,4)<-‘22222’ |
grep(pattern,x,ignore.case=F,fixed=F) | 正则表达式搜索,返回值为匹配的下标 |
sub(pattern,replacement,x,ignore.case=F,fixed=F) | 搜索并替换,如果fixed=T,则pattern是一个文本字符串 |
strsplit(x,split,fixed=F) | 在split处分割字符串,返回一个列表,用unlist()变成向量 |
paste(x,sep=”) | 连接字符串,指定分隔符 |
toupper(x) | 转大写 |
tolower(x) | 转小写 |
5.2.5.其他实用函数
|
---|
函数 | 说明 |
---|
length(x) | 长度 |
seq(from,to,by) | 生产序列 |
rep(x,n,each=n) | 将x重复n次,指定each将会排序 |
cut(x,n) | 分割成n水平的因子 |
pretty(x,n)创建美观的分割点,在绘图中常用
cat(…,file=’myfile’,append=T)|连接…中的对象,并将其输出到屏幕或者文件中
5.3.apply-by系列
5.3.1.apply
[code]# 1=对每行操作,2=对每列操作apply(mydata, margin=1, fun=myfunc)
5.3.2.by,分组汇总操作
[code]# 针对1:4列,根据species因子分组,求均值by(iris[,1:4],Species,mean)
5.3.3.lapply
[code]l=list(a=1:10,b=11:20)lapply(l,mean)
5.3.4.sapply
lapply返回的是一个含有两个元素a和a和b的list,而sapply返回的是一个含有元素[[“a”]]和[[“b”]]的vector,或者列名为a和b的矩阵。
[code]l=list(a=1:10,b=11:20)l.mean=sapply(l,mean)class(l.mean)#提取元素a的均值l.mean[['a']]
5.3.5.tapply
[code]attach(iris)#根据sprcies进行分类,计算petal的均值tapply(iris$Petal.Length,Species,mean)detach(iris)
7基本统计分析
7.1.1描述性统计分析
[code]# 1.查看一般的统计量vars = c('mpg','hp','wt')summary(mtcars[vars])# 2.对一列或多列应用多个函数myfunc <- function(x, na.omit=Flase){ if(na.omit) x = x[!is.na(x)] m=mean(x) n=length(x) s=sd(x) skew=sum((x-m)^3/s^3)/n return(c(n=n,mean=m,stdev=s,skew=skew))sapply(mtcars[vars],myfunc)# 3.其他包里面的描述性统计量library(Hmisc)describe(mtcars[vars])library(psych)describe(mtcars[vars])
7.1.2分组汇总
[code]vars = c('mpg','hp','wt')# 1.简单的 aggregateaggregate(mtcars[vars], by=(am=mtcars$am,vs=mtcats$vs),mean)# 2.一般化的 bymyfunc = function(x)(c(mean=mean(x),sd=sd(x)))by(mtcars[vars], mtcars$am, myfunc)
7.2.1列连表分析
[code]library(vcd)mydata = Arthritis# 1.一维列联表# 1.1 生成频数统计表mytable = with(mydata, table(Improved))# 1.2 将频数统计转成百分比prop.table(mytable)# 2.二维列联表# 2.1 table的用法mytable = table(A,B)# 2.2 xtable的用法mytable = xtabs(~ A+B, data=dataframe)mytable = xtabs(~Treatment+Imporved, data=mydata)# 2.3 添加边际和addmargins(mytable)# 2.4 转成百分比prop.table(mytable)# 3.三维列联表mytable = xtabs(~Treatment+Imporved+Sex, data=mydata)
7.2.2 检验类别型(分类型变量)独立性的方法。
卡方独立性检验
Fisher精确检验
Cochran-Mantel-Heanszel卡方检验
[code]# 1.卡方检验library(vcd)mydata = Arthritis# 1.2先转列联表mytable = xtabs(~Treatment+Imporved, data=mydata)chisq.test(mytable)#p<0.05,说明不独立。# 2.Fisher精确检验的原假设是:边界固定的列联表中行和列是相互独立的。fisher.test(mytable)#p<0.05,说明不独立。# 3.Cochran-Mantel-Heanszel卡方检验的原假设是:两个名义变量在第三个变量的每一层中都是条件独立的。mytable = xtabs(~Treatment+Imporved+Sex, data=mydata)mantelhean.test(mytable)#p<0.05,说明不独立。
7.2.3 相关性的度量
既然变量不独立,那么如何衡量相关性的强弱呢?
[code]library(vcd)mydata = Arthritis# 先转列联表mytable = xtabs(~Treatment+Imporved, data=mydata)assocstats(mytable)# phi系数,列联系数,Cramer's V系数,越大说明相关性较强。
7.3 相关
描述定量变量之间的关系。包括pearson系数,Spearman系数,Kendall相关系数,偏相关系数,多分格(polychoric)系数和多系列(polyserial)相关系数。
7.3.1 pearson,spearman,kendall 相关
pearson:描述两个变量之间的线性相关程度
spearman:描述分级定序变量之间的相关程度
Kendall’s Tau:也是一种非参数的等级相关度量
[code]mydata = state.x77[,1:6]# 1.pearson相关cor(mydata)# 2.spearman相关cor(mydata,method='spearman')# 3.kendall相关cor(mydata,method='kendall')# 注意:得到相关系数后,还需要对相关系数进行独立性检验。
7.3.2 偏相关
指控制一个或多个变量,看另外两个变量之间的相互关系。
[code]library(ggm)pcor(c(1,5,2,3,6), cov(mydata))#c(1,5,2,3,6):前面两个是要计算的偏相关的变量的下标,剩余的是要控制(排除影响)的变量下标。
7.3.3相关性的显著性检验
常用的原假设是:变量间不相关(即总体的相关系数为0)。
[code]cor.test(mydata[,3],mydata[,5])#p<0.05,说明真的是存在相关性。#如果总体相关系数小于0,加参数alternative='less',大于0则alternative='greater',默认是双侧检验(two.side)#参数method='pearson(默认),spearman,kendall'
[code]# 一次计算全部变量的相关系数和显著性检验library(psych)corr.test(mydata, use='complete')# 得到correlation matrix(相关系数矩阵),probility value(显著性P值矩阵)
[code]# 偏相关的检验library(psych)corr_value = pcor(c(1,5,2,3,6), cov(mydata))pcor.test(r,q,n)# r即corr_value# q是要控制的变量数(以数值表示位置)# n是样本的大小
7.4 t检验
研究中最常见的就是对两个组进行比较,包括用没有某种方法,药物,同一种方法前后的变化,两种不同药物的比较,两种不同工艺良品率的比较等。
这里关注结果变量为连续型的组间比较,并假设其呈现正态分布。7.4.1 独立样本的T检验
针对两组独立样本T检验可以用于检验两个总体的均值是否相等。原假设是均值相等,即这两种方法没有什么差别,两种药物的效果是一样的,前后没有明显的变化。
t.test(y~x,data)
y:数值型变量,x:二分变量
默认方差不等,可以用参数 var.equal=T 假定方差相等。
[code]library(MASS)t.test(Prob~So, data=UScrime)#p<0.05,说明南方和北方各州的监禁率是不等的。
7.4.2 非独立样本的T检验
比如年轻的比年长的失业率是否更高?这个就是不独立的。在两组的观测之间相关时,获得的是一个非独立组设计,前-后测试,重复性测量设计同样会产生非独立的组。
假定组间的差异呈现正态分布。
t.test(y1,y2, paired=T)
y1,y2是两个非独立组的数值向量
p<0.05,说明二者的均值是不一样的,即有差别。
7.4.3 多余两组的比较
用方差分析(ANOVA).
7.5 组间差异的非参数检验
如果无法满足t检验或者方差分析的参数假设,就需要非参数方法。
7.5.1 两组的比较
1.若两组数据独立,用Wilcoxon秩和检验(即Mann-Whitney U检验)来评估是否从相同的概率分布中抽的,即检验是否来自相同的总体。
[code]# y是数值型变量,x是二分变量wilcox.test(y~x, data)#y1,y2是各组的结果变量wilcox.test(y1,y2)# p<0.05,说明来自不同的总体,即均值什么的是不一样的,二者有差异。library(MASS)wilcox.test(Prob~So, data=UScrime)
2.wilcoxon符号秩和检验是非独立样本T检验的一种非参数替代方法,适用于两组成对数据和无法保证正态分布假设的情景。
[code]library(MASS)with(UScrime, wilcox.test(U1,U2,paried=T))
7.5.2 多于两组的比较
比如要比较美国4个地区的文盲率。
这称为单向设计。
如果无法满足ANOVA设计的假设,那么可以使用非参数方法来评估组间的差异,如果各组独立,则Kruskal-Wallis检验,如果不独立(如重复测量设计或随机分组设计),则Friedman检验。
Kruskal.test(y~A, data)
y是数值型结果变量,A是拥有两个及以上的分组变量
friedman.test(y~A|B, data)
y是数值型结果变量,A是分组变量,B是一个用以认定匹配观测的区组变量(blocking variable)
[code]mydata = as.data.frame(cbind(state.region, state.x77))kruskal.test(Illiteracy~state.region, data=mydata)# p<0.5,说明四个地区的文盲率各不相同。
但是没有告诉你哪些地区显著与其他地区不同。这时候需要使用Mann-Whitney U检验每次比较两组数据。
一个更优雅的方法是:在控制了犯第一类错误的概率的前提下,执行可以同步进行的多组比较,这样可以直接完成所有组之间的成对比较。使用npmc包。
[code]class = state.regionvar = state.x77[,c('Illiteracy')]mydata = as.data.frame(cbind(class,var))library(npmc)summary(npmc(mydata),type='BF')# p.value.2s双侧概率查看两两比较的结果,p<0.05说明存在明显差异。
8回归
8.1回归的多面性
|
---|
回归类型 | 用途 |
---|
简单线性 | 用一个量化解释变量预测一个量化的响应变量 |
多项式 | 用一个量化解释变量预测一个量化的响应变量,模型的关系是N阶多项式 |
多元线性 | 用两个多多个量化的解释变量预测一个量化的响应变量 |
多变量 | 用一个或多个解释变量预测多个响应变量 |
Logistic | 用一个或多个解释变量预测一个类别型响应变量 |
泊松 | 用一个或多个解释变量预测一个代表频数的响应变量 |
cox比例风险 | 用一个或多个解释变量预测一个时间(死亡,失败或旧病复发)发生的时间 |
时间序列 | 对误差项相关的时间序列建模 |
非线性 | 用一个或多个量化解释变量预测一个量化的响应变量,模型的关系非线性的 |
非参数 | 用一个或多个量化解释变量预测一个量化的响应变量,模型源自数据形式,不能实现设定 |
稳健 | 用一个或多个量化解释变量预测一个量化的响应变量,能抵御强影响点的干扰 |
8.2 最小二乘法(OLS)回归
Y^=β0^+β1^X1i+...++βi^Xki
\hat{Y}=\hat{\beta _{0}} + \hat{\beta _{1}}X_{1i}+...++ \hat{\beta _{i}}X_{ki}
求解使得残差平方和最小
∑(Yi?Y^i)2=∑(Yiβ0^+β1^X1i+...++βi^Xki)2=∑ε2
\sum \left ( Y_{i} - \hat{Y}_{i} \right )^{2}= \sum \left ( Y_{i}\hat{\beta _{0}} + \hat{\beta _{1}}X_{1i}+...++ \hat{\beta _{i}}X_{ki} \right )^{2} = \sum \varepsilon ^{2}
OLS的基本假设 - 正态性:对于固定的自变量值,因变量成正态分布。
- 独立性:Yi值(或残差)之间相互独立
- 线性:因变量和自变量之间为线性关系
- 同方差性:因变量的方差不随自变量的水平不同而变化,也称为不变方差。
对你和模型非常游泳的函数
|
---|
函数 | 说明 |
---|
lm | 拟合函数 myfit=lm(formula, mydata) |
summary(myfit) | 展示模型的详细结果。Coefficients为模型参数,Multiple R-squared为拟合优度(R2),p值为模型整体显著性检验值,P<0.05说明模型整体通过检验,参数的检验在Coefficients中 |
coefficients(myfit) | 模型的拟合参数 |
confint(myfit) | 模型参数的置信区间 |
fitted(myfit) | 模型的预测值 |
residuals(myfit) | 模型的残差值 |
anova(myfit) | 生成拟合模型的方差分析表,或者比较两个或者更多拟合模型的方差分析表 |
vcov(myfit) | 列出模型参数的协方差矩阵 |
AIC(myfit) | 输出赤池统计量 |
plot(myfit) | 生成拟合模型的诊断图 |
predict() | 用模型去预测新的数据集 |
8.2.2简单的线性回归
[code]fit = lm(weight~height, data=women)summary(fit)# 查看预测值fitted(fit)# 查看模型的残差residuals(fit)# 生成拟合模型的诊断图plot(women$height, women$weight,xlab='x轴',ylab='y轴')# 添加拟合直线abline(fit)
8.2.3多项式回归
[code]fit2 = lm(weight~height+I(height^2), data=women)summary(fit2)# 生成拟合模型的诊断图plot(women$height, women$weight,xlab='x轴',ylab='y轴')# 添加拟合直线lines(women$height,fitted(fit2))
8.2.4多元线性回归
最好先检查下变量之间的相关性
[code]mydata = as.data.frame(state.x77[,c('Murder','Population','Illiteracy','Income','Frost')])# 检查变量之间的相关性cor(mydata)# 变量相关关系的散点图矩阵library(car)scatterplotMatrix(mydata,spread=F,lty.smooth=2,main='scatter plot matrix')# 多元线性回归fit = lm(Murder~Population+Illiteracy+Income+Frost, data=mydata)summary(fit)
8.2.5有交互项的多元线性回归
[code]fit = lm(mpg~hp+wt+hp:wt, data=mtcars)summary(fit)
回归诊断
8.3.1标准方法
最简单的就是使用plot(fit)绘制模型的拟合诊断图。
[code]fit = lm(weigth~height, data=women)par(mfrow=c(2,2))plot(fit)
生成的四幅图对应的OLS假设 1. Residuals vs Fitted <–> 线性
2. Normal Q-Q <–> 正态性
3. Scale-Location <–> 同方差性
4. Residuals vs Leverage (残差与杠杆图,关注离群点)
正态性:当预测变量值固定时,因变量成正态分布,则残差值也应该是一个均值为0的正态分布。Q-Q图是在正态分布对应的值下,标准化残差的概率图,Q-Q图上的点应该落在45°直线上。
独立性:从上面的图是无法看出因变量是否相互独立,只能从收集的数据集中验证。
线性:若y-x线性相关,那么残差值和预测值(拟合值)就没有任何的系统关联。除了白噪声,模型应该包含数据中的所有方差。Residuals vs Fitted图却有一个曲线关系,说明应该对模型增加一个二次项。
同方差性:若满足同方差,则Scale-Location图中,水平线周围的点应该随机分布。
8.3.2改进的方法
car包中的回归诊断函数
|
---|
函数 | 说明 |
---|
qqPlot() | 分位数比较图 |
durbinWatsonTest() | 对误差自相关做Durbin-Watson检验 |
crPots() | 成分与残差图 |
ncvTest() | 对非恒定的误差方法做得分分析 |
spreadLevelPlot() | 分散水平检验 |
outlierTest() | Bonferroni离群点检测 |
avPlots() | 添加的变量图像 |
inluencePlot() | 回归影像图 |
scatterplot() | 增强的散点图 |
scatterplotMatrix() | 增强的散点图矩阵 |
vif() | 方差膨胀因子 |
1.正态性
qqplot()画出n-p-1个自由度的t分布下的学生化残差,也成为学生化删除残差或折叠化残差。n是样本量,p是回归参数的数目(包括截距项)。
[code]library(car)mydata = as.data.frame(state.x77[,c('Murder','Population','Illiteracy','Income','Frost')])fit = lm(Murder~Population+Illiteracy+Income+Frost, data=mydata)# 绘制95%置信区间的学生化残差图qqplot(fit, labels=row.names(mydata),id.method='identity', simulate=T)# 在95%区间外的点,是模型高估或者低估该点(对应的现实事件是这个地点的谋杀率)。mydata['Nevada']# 查看模型预测值fitted(fit)['Nevada']# 查看残差residuals(fit)['Nevada']rstudent(fit)['Nevada']
2.误差的独立性
判断因变量值(或残差)是否相互独立,最好的方法是依据收集数据方式的先验知识。
Durbin-Watson检验,能检测误差的序列相关性。
[code]durbinWatsonTest(fit)# p<0.05,说明误差不独立。lag=1表明数据集里面每个数据都是与其后一个数据进行比较的。该检验适用于时间独立的数据,对于非聚集型的数据并不适用。
3.线性
通过成分残差图(也称偏残差图),可以看到因变量和自变量之间是否呈现非线性关系。也可以看看是否有不同于已设定线性模型的系统偏差。
[code]library(car)crPlots(fit)#若图像存在非线性,说明可能对预测变量的函数形式建模不够充分,那么就需要添加一些曲线成分。
4.同方差性
ncvTest()函数生成一个计分检验,零假设是误差方差不变,备选假设是误差方差随着拟合值水平变化而变化。
spreadLevelPlot()创建一个添加了最佳拟合曲线的散点图,而且给出调整建议。
[code]library(car)ncvTest(fit)# p>0.05,说明方差相等,满足模型假设spreadLevelPlot(fit)
8.3.3线性模型假设的综合验证
给出模型假设一个单独的综合检验(通过或者不通过),如果不通过,需要哟个前面的方法去判断哪些假设没有被满足。
[code]library(gvlma)gvmodel=gvlma(fit)summary(gvmodel)# Global Stat的P值>0.05,说明满足OLS的所有假设。
8.3.4多重共线性
使用方差膨胀因子vif,如果vif>4则说明存在多重共线性。
[code]library(var)vif(fit)
8.4.1离群值
方法1;在8.3.2.1的qq图中,落在95%置信区间外的是离群值。
方法2:标准化残差>2或<-2的也可能是离群值
[code]library(car)outlierTest(fit)# Bonferonni P <0.05,说明是离群值。
8.4.2 高杠杆值点
即与其他预测变量有关的离群点,换句话说,他们是由许多异常的预测变量值组合起来,与响应变量值没有关系。
高杠杆值点是通过帽子统计量判断。帽子均值是p/n,p是模型预计的参数数目(包括截矩),n是样本量。
[code]hat.plot = function(fit){ p=length(coefficients(fit)) n=length(fitted(fit)) plot(hatvalues(fit),main='index plot of hat values' abline(h=c(2,3)*p/n, col='red',lty=2) identity(1:n,hatvalues(fit),names(hatvalues(fit)))}
8.4.3强影响点
即对模型参数估计值影响有些比例失衡的点,例如移除模型的一个观测点时模型会发生巨大的变化,那么就要检测下有没有强影响点的存在了。
1. 通过Cook距离,或称D统计量。Cook’s D>4/(n-k-1)就是强影响点
2. 变量添加图
[code]cutoff = 4/(nrow(mydata)-length(fiti$coefficients)-2)plot(fit,which=4,cook.levels=cutoff)abline(h=cutoff,lty=2,col='red')
将离群点,杠杆值,强影响点整合在一张图中。
[code]library(car)influencePlot(fit,id.method='identify')# 纵坐标在[-2,2]之外的可认为是离群点,水平轴>0.2或0.3的有搞杠杆值。圆圈的大小和影响成正比,圆圈很大的点可能是对模型参数的估计造成不成比例影响的强影响点。
8.6选择最佳的回归模型
8.6.1模型比较
AIC准则,越小越好,说明选用较少的参数获得足够好的拟合度。
[code]fit1 = lm(Murder~Population+Illiteracy+Income+Frost, data=mydata)fit2 = lm(Murder~Population+Illiteracy, data=mydata)AIC(fit1,fit2)
8.6.2变量选择
1.逐步回归
[code]library(MASS)fit = lm(Murder~Population+Illiteracy+Income+Frost, data=mydata)# 1.逐步回归stepAIC(fit, direction='backward')#然后根据给出的AIC变化钻则最佳的参数模型
2.全子集回归
[code]library(leaps)leaps=regsubsets(Murder~Population+Illiteracy+Income+Frost, data=mydata, nbest=4)# 根据调整R2挑选模型plot(leaps,scale='adjust R2')# 根据Mallows Cp统计量挑选模型# 越靠近y=x+1直线的越好。但是从实际业务角度出发,有时候又不是这样的。library(car)subsets(leaps,statistic='cp')abline(1,1,lty=2,col='red')
8.7交叉验证
交叉验证的函数
[code]shrinkage = function(fit,k=10){ require(bootstrap) #定义函数 theta.fit=function(x,y){lsfit(x,y)} #定义函数 theta.predict=function(fit,x){cbind(1,x)%*%fit$coef} x=fit$model[,2:ncol(fit$model] y=fit$model[,1] resuts=corssval(x,y,theta.fit,theta.predict,ngroup=k) r2=cor(y,fit$fitted.values)^2 r2cv=cor(y,results$cv.fit)^2 cat('original R-square=',r2,'\n') #初始R方 cat(k,'fold cross-validated R-square=',r2cv,'\n') #交叉验证的R方}# 1.先创建回归方差fit = lm(Murder~Population+Illiteracy+Income+Frost, data=mydata)# 2.交叉验证shrinkage(fit,10)
8.8相对重要性
1.标准化的回归系数
这是比较简单的方法。在分析之前,先用scale()将数据标准化为mean=0,std=1的数据集,这样用R回归得到的就是标准化的回归系数。(注意,scale得到的是矩阵,而lm接收的是数据库,所以要转换一下)
[code]zmydata = as.data.frame(scale(states))zfit = lm(Murder~Population+Illiteracy+Income+Frost, data=mydata)coef(fit)
2.相对权重法
它是对所有可能子模型添加一个预测变量引起的R2平均增加量的一个近似值。
[code]# 1.自定义函数relweights = functionc(fit,...){ R=cor(fit$model) nvar=ncol(R) rxx=R[2:nvar,2:nvar] rxy=R[2:nvar,1] svd=eigen(rxx) evec=svd$vectors delta=diag(sqrt(ev)) lambda=evec %*% delta %*% t(evec) lambdasq=lambda^2 beta=solve(lambda) %*% rxy rsquare=colSums(beta^2) rawwgt=lambadasq %*% beta^2 import=(rawwgt/rsquare)*100 lbls=names(fit$model[2:nvar]) rownames(import)=lbls rownames="weights" barplot(t(import),names.arg=lbls, ylab='% of R-square', xlab='predctor variables' main='relative importance of predictor variables', sub=paste('R-square=',round(rsquare,digits=3)), ...) return(import)}# 1.先拟合模型fit=lm(Murder~Population+Illiteracy+Income+Frost, data=mydata)# 2.返回变量的权重relweights(fit,col='lightgrey')
9方差分析
当包含的因子是解释变量时,关注的重点僵尸组别差异的分析,这种分析法叫方差分析(ANOVA).
|
---|
| 患者 | 时间 | |
---|
| | | 5周 |
疗法 | CBT | s1,s2,s3,s4,s5 | |
| EMDR | s6,s7,s8,s9,s10 | |
治疗方案是两水平(CBT,EMDR)的组间因子,之所以称作
组间因子,是因为每个患者都仅分配到其中的一个方案中。
s是受试者(患者)。
因为每种治疗方案的观测数目都一样,所以也成为
“均衡设计”,若观测数不同,则称为
“非均衡设计”。
如果仅有一个类别型变量,则称为
单因素方差分析。
疗法是组间因子,所以称为
组间方差分析。
时间是两水平的组内因子,所以称
为组内方差分析。因为患者在不同的时间被测量,也称为
重复测量方差分析。
疗法和时间组成的
双因素方差分析。
若因子设计包括组内和组间因子,又称作
混合模型方差分析。
疗法和时间都作为因子时,既可以分析疗法的影响(时间跨度平均)和时间的影响(疗法类型跨度的平均),又可以分析疗法和时间的交互影响。前两者叫
主效应;后者叫
交互效应。
方差分析主要通过F检验进行效果评测,原假设是组内或组间没有差异。
混淆因素:抑郁程度是接受治疗后的因变量,同时抑郁程度也会影响治疗的效果,所以抑郁程度也可以是组间差异,这时抑郁程度就是混淆因素。
干扰变数:如果你对混淆因素不感兴趣,那它就是干扰变数。
协变量:如果在评测疗法的影响前,对任何抑郁水平的组间差异进行统计调整。这就是协变量。
协方差分析:协变量对应的方差分析。
如果
因变量不止一个,就是多元方差分析(MANOVA),如果协变量也存在,就是多元协方差分析(MANCOVA)。
9.2ANOVA模型
aov(formula, data=dataframe)
|
---|
设计 | formula |
---|
单因素ANOVA | y~A |
含单个协变量的单因素ANCOVA | y~x+A |
双因素ANOVA | y~A*B |
含两个协变量的双因素ANCOVA | y~x1+x2+A*B |
随机化区组 | y~B+A(B是区组因子) |
单因素组内ANOVA | y~A+Error(Subject/A) |
含单个组内因子(W)和单个组间因子(B)的重复测量ANOVA | y~B*W+Error(Subject/B) |
顺序很重要y~A+B+A:B
序贯型:效应根据表达式中出现的效应作调整。A不做调整,B根据A调整,A:B交互项根据A和B调整。
分层型:效应根据同水平或低水平的效应做调整。A根据B调整,B根据A做调整,A:B同时根据A和B做调整。
边界型:每个效应根据其他各效应做相应的调整。A根据B和A:B做调整,A:B根据A和B做调整。
R默认采用序贯型方法,spss,sas默认使用边界型方法。
R中的ANOVA表的结果将评价:
A对y的影响
控制A时,B对y的影响
控制A和B时,A和B的交互效应
样本大小越不平衡,效应项的顺序对效果的影响越大。
一般来说,越基础的效应项越需要放在表达式的前面。具体来讲,首先是协变量,然后是主效应,接着是双因素的交互项,再接着是三因素的交互效应,以此类推。
对于主效应,越基础的变量越应该放在表达式的前面,因此性别要放在处理方式之前。有一个基本的准则:若研究设计不是正交的(也就是说,因子和或协变量相关),一定要谨慎设置效应的顺序。
car包的Anova()函数(注意不是anova()函数)提供分层型和边界型的方法,而aov()使用序贯型方法。如果要保持和SPSS,SAS的方法保持一致,可以使用Anova()函数。
9.3单因素方差分析
[code]library(multcomp)attach(cholesterol)#各样本的大小table(trt)#各组的均值aggregate(response,by=list(trt),FUN=mean)#各组的标准差aggregate(response,by=list(trt),FUN=sd)#检验组间差异fit=aov(response~trt)summary(fit)#p<0.05,说明各组之间有差异# 绘制各组均值及其置信区间的图像library(gplots)plotmeans(response~trt, xlab='treatment',ylab='response',main='mean plot with 95% CI')detach(cholesterol)
9.3.1 多重比较
aov()函数只说明各组之间有差异,不能说明哪种方法和其他方法有差别。
这时候要对各组均值差异的成对检验
[code]TukeyHSD(fit)
9.3.2评估检验的假设条件
单因素方差分析的假设条件:
1. 假设因变量服从正态分布
2. 各组方差相等
正态分布的检验[code]library(car)qqplot(lm(response~trt,data=cholesterol),simulate=T,main='Q-Q plot',label=F)#注意,qqplot()函数需要用lm()拟合。#数据落在95%的置信区间内,说明满足正态分布假设。
方差齐性检验[code]bartlett.test(response~trt, data=cholesterol)#p>0.05,说明组间方差并没有显著不同。
方差齐性检验对离群点非常敏感,需要用前面的方法检测离群点。
[code]library(car)outlierTest(fit)
9.4 单因素协方差分析
[code]data(litter,packag='multcomp')attach(litter)table(dose)aggregate(weight,by=list(dose),FUN=mean)#注意:要将协变量放在表达式的前面fit=aov(weight~gesttime+dose)summary(fit)#发现:a,怀孕时间和幼崽的出生体重相关,b,控制怀孕时间,药物剂量与出生体重有关。
由于使用了协变量,可能想知道获取调整的组均值,即去除协变量(gesttime)效应后的组均值。
[code]library(effects)effect('dose',fit)
9.4.1组间均值的成对比较
[code]library(multcomp)contrast = rbind('no drug vs drug'=c(3,-1,-1,-1))summary(glht(fit,linfct=mcp(dose=contrast)))# p<0.05,说明未用药比其他用药条件下出生体重高的结论。#c(3,-1,-1,-1)设定第一组和其他三组的均值比较,其他对组可用rbind()函数添加,详见help(glht)
9.4.2评估检验的假设条件
同样要求正态性和同方差性假设外,还假定回归斜率相同
正态性和方差齐性可以用9.3的方法。
下面检测回归斜率的同质性。ANCOVA模型包含怀孕时间*剂量的交互项时,可以回归斜率的同质性进行检验,交互项显著时,则意味着怀孕时间和出生体重间的关系依赖药物剂量的水平。
[code]library(multcomp)fit2=aov(weight~gesttime*dose, data=litter)summary(fit2)#看gesttime:dose项的p值,p>0.05,说明交互不显著,支持斜率相等的假设。
若假设不成立,可以尝试变化协变量或因变量,或使用能对每个斜率独立解释的模型,或使用不需要假设回归斜率同质性的非参数ANCOVA方法。
9.5双因素方差分析
背景:60只老鼠,分几组,用2钟喂食方法,每种喂食方法又有3种不同的水平,看牙齿的长度。
[code]library(ToothGrowth)#均衡设计,因为每组的样本量是一样的table(supp,dose)#查看各组的均值和方差aggregate(len,by=list(supp,dose),FUN=mean)aggregate(len,by=list(supp,dose),FUN=sd)#双因素方差分析fit=aov(len~supp*dose)#查看主效应和交互效应都非常显著p<0.05summary(fit)#可视化结果library(gplots)plotmeans(len~interaction(supp,dose,sep=' '), connect=list(c(1,3,5),c(2,4,6)), col=c('red','darkgreen'), main='interaction plot with 95% CIs', xlab='treatment and dose combination')#图形展示了均值,误差棒(95%的置信区间)和样本量大小。
9.6重复测量方差分析
重复测量,即受试者被测量不止一次。
因变量:植物CO2的吸收量uptake
自变量:植物类型TYPE(加拿大和美国地区)和七个水平的CO2浓度CONC。其中type是组间因子,conc是组内因子。
[code]wlbl=subset(CO2,Treatment=='chilled')fit=aov(uptake~conc*type+Error(Plant/conc),wlbl)summary(fit)#可视化with(wlbl, interaction.plot(conc,Type,uptake, type='b',col=c('red','blue'),pch=c(16,18), main='interaction plot for plant type and concentration'))
重复测量方差分析的假设: 假设任意组内因子的协方差矩阵为球形,并且组内因子两水平间的方差只差相等。
如果不满足,则衍生出一些备选方法:
1. lme4包中的lmer()函数拟合线性混合模型
2. car包中Anova()函数调整传统检验统计量,以弥补球形假设的不满足(如Geisser-Greenhouse校正)
3. 使用nlme包的gls()函数拟合给定方差-协方差结果的广义最小二乘模型
4. 用多元方差分析对重复测量数据进行建模
9.7多元方差分析
当结果变量不止一个,就是多元方差分析。
背景:研究美国谷物中卡路里,脂肪,糖含量是否会因为存储位置的不同而发生变化。存储位置是货架,有3个不同的水平。
[code]library(MASS)attach(UScereal)#将结果变量合成一个矩阵y=cbind(colories,fat,sugars)#查看各个货架位置的均值aggregate(y,by=list(shelf), FUN=mean)#各谷物间的方差和协方差cov(y)#组间差异的多元检验fit=manova(y~shelf)summary(fit)#由于多元检验是显著的,所以可以对每个变量做单因素方差分析summary.aov(fit)
9.7.1单因素多元方差的前提假设
多元正态性。指因变量组成的向量服从一个多元正态分布,可用qq图检验。
方差-协方差矩阵同质性。即各组的协方差矩阵相同,可以通过Box’s M检验。但是目前R中并没有这个检验的函数。由于该检验对正态假设很敏感,会导致大部分案列直接拒绝同质性假设。
[code]#检验多元正态性center=colMeans(y)n=nrow(y)p=ncol(y)cov=cov(y)d=mahalanobis(y,center,cov) #马氏距离coord=qqplot(qchisq(ppoints(n),df=p), d,main='q-q plot assessing multivariate normality', ylab='mahalanobis D2')abline(a=0,b=1)identify(coord$x,coord$y,labels=row.names(UScereal))#若数据服从多元正态分布,那么点将落在直线上。#从图形上可以看到一些离群点,可以删除在重新分析。
[code]#检验多元离群点linrary(mvoutlier)outliers=aq.plot(y)outliers
9.7.2稳健多元方差分析
如果多元正态性或者方差-协方差均值假设都不满足,又或者担心多元离群点,就可以考虑稳健或非参数的MANOVA检验。
稳健单因素MANOVA可以通过rrcov包中的Wilks.test()函数实现。vegan包中的adonis()函数则提供了非参数的MANOVA的等同形式。
[code]library(rrcov)Wilks.test(y,shelf,method='mcd')#p<0.05,说明存储位置不同,谷物的营养含量确实不同。
10功效分析
目的:
1. 计算需要的样本量
2. 计算概率值,置信区间
可以帮助你在给定的置信度下,判断检验到给定的效应值时所要的样本量。
或者,在给定置信度水平下,计算在样本内能检测到给定效应值的概率。
I类错误:弃真错误,实际为真,你却认为是假的。
II类错误:纳伪错误,实际为假,你却认为是真。
显著性水平(alpha) 有I类错误的概率来定义,可以看作是发生效应不发生的概率。
功效 通过I减去II类错误的概率来定义,可以看作是真是效应发生的概率。
效应值 指在备选假设或研究假设下的效应的量。
四个量: 1. 功效1-p(II型错误)
2. 效应值(ES)
3. 显著性水平P(I类错误)
4. 样本大小n
效应分析的目的:最大化真是效应发生的概率,最小化发现错误效应的概率,同时把研究成本控制在合理的范围内。
也就是说:要是P尽可能小,这样1-p才会尽可能大。
这四个量知道其中三个就能计算第四个。
10.2pwr功效分析
|
---|
函数 | 功效计算的对象 |
---|
pwr.2p.test() | 两比列(n相等) |
pwr.wpwn.test() | 两比列(n不想等) |
pwr.anova.test() | 平衡的单因素ANOVA |
pwr.chisq.test() | 卡方检验 |
pwr.f2.test() | 广义线性模型 |
pwr.p.test() | 比例(单样本) |
pwr.r.test() | 相关系数 |
pwr.t.test() | t检验(单样本、两样本、配对) |
pwr.t2n.test() | t检验(n不等的两样本) |
10.2.1T检验
pwr.t.test(n=,d=,sig.level=,power=,type=,alternative=)
n:样本大小
d:效应值,即标准化均值之差
sig.level:显著性水平,默认0.05
power:功效水平
type:检验类型:双样本T检验(two.sample),单样本T检验(one.sampe),相依样本T检验(paired).默认two.sample.
alternative:双侧检验(two.sided)还是单侧检验(less或greater).
[code]#想检测总体均值0.5个标准差的差异,并且误报差异概率要求在0.01以内,只有40个样本,那么能检测到这么大总体均值差异的概率。pwr.t.test(n=20,d=0.5,sig.level=0.01,type='two.sample',alternative='two.sided')# power=0.14,即有低于14%的可能性断性断言不显著。或者说有86%的概率错误你要寻找的效应值。
10.2.2方差分析
[code]#对5组做单因素方差分析,要达到0.8的功效,效应值为0.25,显著性水平为0.05,需要的样本数。pwr.anova.test(k=5,f=0.25,sig.level=0.05,power=0.8)#n=39,k=5,即每组需要39人,总共195人。
10.2.3相关性
pwr.r.test(n,r,sig.level,power,alternative)
r是效应值,通过线性相关系数衡量。
[code]H0:p<=0.25, H1:P>0.25#如果你想有90%的信息拒绝H0,需要的样本数pwr.r.test(r=0.25,sig.level=0.05,power=0.9,alternative='greater')
10.2.4线性模型
10.2.5比例检验
10.2.6卡方检验
13广义线性模型
1.因变量可能是类别型(logistic回归)
2.因变量可能是计数型(泊松回归),比如一周交通事故的数目,每日酒水消耗数。
13.1.1glm()函数
glm(formula,family=family(link=function),data=)
概率分布family和默认的连接函数function
|
---|
分布族 | 默认的连接函数 |
---|
binomial | link=’logit’ |
gaussian | link=’identity’ |
gamma | link=’inverse’ |
inverse.gaussian | link=’1/mu^2’ |
poisson | link=log |
quasi | (link=’identity’,variance=’constant’) |
qiasobomial | link=’logit’ |
quasipoisson | link=’log’ |
广义线性模型可以拟合很多留下的模型,比如logistic回归,泊松回归,生存分析等。
logistic glm(y~x1+x2+x3,family=binomial(link='logit'),data=mydata)
泊松回归 `glm(y~x1+x2+x3,family=poisson(link=’log’),data=mydata)·
线性回归 glm(y~x1+x2+x3,family=gaussian(link='identity'),data=mydata)
和下面的是一样的
lm(y~x1+x2+x3,data=mydata)
13.1.2和glm一起的函数
|
---|
函数 | 说明 |
---|
summary() | 展示拟合模型的细节 |
coefficients(),coef() | 列出拟合模型的参数(截矩项和斜率) |
confint() | 模型的置信区间 |
residuals() | 模型的残差值 |
anova() | 生成两个拟合模型的方差分析表 |
plot() | 生成拟合模型的诊断图 |
predict() | 用模拟去预测新的数据 |
13.1.3模型拟合和回归诊断
广义线性模型模型还没有比较统一的说法,当评价模型的适用性时,可以绘制初始响应变量的预测值与残差的图。
[code]plot(predict(model,type='response'), residuals(model,type='deviance'))
13.2logistic回归
[code]# 查看基本统计量data(Affairs, package = "AER")summary(Affairs)table(Affairs$affairs)# 将affairs转化成二值因子ynaffairAffairs$ynaffair[Affairs$affairs > 0] <- 1Affairs$ynaffair[Affairs$affairs == 0] <- 0Affairs$ynaffair <- factor(Affairs$ynaffair, levels = c(0, 1), labels = c("No", "Yes"))table(Affairs$ynaffair)#该二值因子可以看作是logistic的结果变量fit.full = glm(ynaffair~gender+age+yearsmarried+children+religiousness+education+occupation+rating, data=Affairs,family=binomual())#summary(fit.full)#去掉系数不显著的变量重新拟合fit.reduced=glm(ynaffair~age+yearsmarried+religiousness+rating,data=Affairs,family=binomial())summary(fit.reduced)
模型的比较[code]#这里的情况是嵌套模型,模型2的变量全部包含在模型1种了,可以用anova()函数比较,对于广义线性回归,可以用卡方检验。naova(fit.reduced,fit.full,test='Chisq')# p>0.05,说明两个模型没有差别,拟合一样好,就没必要用变量比较多的fit.full了。
13.2.3过度离势
所谓过度离势,就是观测到的响应变量的方差大于期望的二项分布的方差。过度离势会导致奇异的标准误检验和不精准的显著性检验。
当出现过度离势时,仍可以使用glm()拟合logistic,但是需要将二项分布改为类二项分布。
检测过度离势的一种方法是:比较二项分布模型的残差偏差和残差自由度
V=残差偏差/残差自由度
越接近1说明没有过度离势。
13.3泊松回归
[code]data(breslow.dat, package='robust')names(breslow.dat)summary(breslow.dat[c(6,7,8,10)])#fit = glm(sumY~Base+Age+Trt,data=breslow.dat,family=poisson())summary(fit)
13.3.2
当响应变量观测的方差比依据泊松分布预测的方差大,泊松回归可能发生过度离势。可能原因是:遗漏了某个重要的变量,可能因为事件相关,在纵向数据分析中,重复测量的数据由于内在的群聚特性可导致过度离势。
[code]library(qcc)qcc.overdispersion.test(breslow.dat$sumY,type='poisson')#p<0.05,说明有过度离势。
13.3.3扩展
时间段变化的泊松回归
零膨胀的泊松回归
稳健泊松回归
14主成分和因子分析
主成分分析(PCA):是一种数据降维技巧,能将大量相关变量转成一组很少的不相关的变量,这些无关的变量称为主成分。
因子分析(EFA):用来发现一组变量的潜在结构的方法,通过寻找一组更小的、潜在的或隐藏的结果来解释以观测到的,显式的变量间的关系。
主成分是观测变量的线性组合,形成线性组合的权重都是通过最大化各主成分所解释的方差来获得,同时还要保证各主成分间的不相关。
相反,因子分析被当作是观测变量的结果基础或者原因,而不是他们的线性组合。代表观测变量放哈的误差无法用因子来解释。
PCA函数:princomp()
EFA函数:factanal()
14.1psych包中游泳的因子分析函数
|
---|
函数 | 描述 |
---|
principal() | 含有多种可选方法的方差旋转的主成分分析 |
fa() | 可用主轴、最小残差、加权最小平方、最大似然法估计的因子分析 |
fa.parallel() | 含平行分析的碎石图 |
factor.plot() | 绘制因子分析或主成分分析的结果 |
fa.diagram() | 绘制因子分析或主成分的载荷矩阵 |
scree() | 因子分析和主成分分析的碎石图 |
14.1.1步骤
数据预处理,在计算前需要确保没有确实值
选择因子模型,是PCA还是EFA。如果是EFA,还需要指定一种估计因子模型的方法(如最大似然估计)
判断要选择的主成分/因子数目
选择主成分/因子
旋转主成分/因子
解释结果
计算主成分/因子得分
14.2主成分分析
14.2.1 判断主成分的个数
根据先验经验和理论知识判断主成分数
根据要解释变量方差的累积值的阈值来判断需要的主成分个数
通过检查变量间k*k的相关系数矩阵来判断需要保留的主成分个数
最常见的是基于特征值的方法。每个主成分都与相关系数矩阵的特征值相关联,第一主成分与最大的特征值相关联,第二主成分与第二大的特征值关联,以此类推。
Kaiser-Harris准则建议保留特征值>1的主成分。特征值<1的主成分所解释的方差比单个变量中的方差更少。在EFA(因子分析)中则是要求保留>0的,这点和主成分分析不同。
Cattell碎石检验,则绘制了特征值与主成分数的图像。这类图形清晰展示图形的弯曲情况,在图形变化最大处之上的主成分都可以保留。
平行分析:可以用随机数模拟,依据与初始矩阵大小相同的随机数矩阵来判断要提取的特征值,若基于真实数据的某个特征值大于一组随机数矩阵相应的平均特征值,那么该主成分可以保留。
[code]library(psych)fa.parallel(USJudgeRatings[,-1],fa='PC',n.iter=100, show.legend=F,main='scree plot with parallel analysis')# 大于1的特征值都可以保留
14.2.2提取主成分
principal(r,nfactors=,rotate=,scores=)
r是相关系数矩阵或者原始数据矩阵
nfactors主成分个数,默认为1
rotate指定的旋转方法,默认最大方差旋转(varimax)
scores是否需要计算主成分得分,默认不需要
[code]library(psych)pc=principal(USJudgeRatings[,-1],nfactors=1)
输出 - 第一主成分PC1,包含了成分载荷,指观测变量和主成分的相关系数。可以看到主成分和变量之间的相关程度,PC1越大,则越相关。
- h2:成分的公因子方差,主成分对每个变量的方差解释度。
- u2:成分唯一性,方差无法被主成分解释的比例(u2=1-h2)
SS loadings行包含了与主成分相关联的特征值,指的是与特定主成分相关联的标准化后的方差值。
Proportion var 行表示每个主成分对整个数据集的解释程度。
[code]# 两个主成分的例子library(psych)fa.parallel(Harman23.cor$cov, n.obs=302,fa='PC',n.iter=100, show.legend=F,main='Scree plot with parallel analysis')# 可以看到需要2个主成分pc=principal(Harman23.cor$cov,nfactors=2,rotate='none')
14.2.3 主成分旋转
将成分载荷矩阵变得更容易解释的方法,它们尽可能对成分去噪。
旋转方法有两种:是选择的成分保持不相关(正交旋转),和让他们变得相关(斜交旋转)。
选择方法依据去噪的定义不同而不同,最流行的正交旋转是方差极大旋转,它试图对载荷菊展的列进行曲噪,使得每个成分只是由一组有限的变量来解释(即载荷矩阵每列只有少数几个很大的载荷,其他都是很小的载荷)。
[code]rc=principal(Harman23.cor$cov,nfactors2,rotate='varimax')#列名也从PC-->rc,表示成分被旋转了。
13.2.4获取主成分的得分
[code]library(psych)pc=principal(USJudgeRatings[,-1],nfactors=1,score=T)head(pc$scores)#scores=T时,主成分得分存储在principal函数返回对象的scores元素中。如果需要,还可以获取律师与法官的接触频数与法官评分间的相关系数cor(USJudgeRatings$CONT,pc$score)
当主成分基于相关系数矩阵时,原始数据便不可用了,也不能获取每个观测主成分得分,但是可以得到用来计算主成分得分的系数。
[code]library(pysch)rc=principal(Harman23.cor$cov,nfactors2,rotate='varimax')round(unclass(rc$weights),2)# 利用rc1,rc2的在各个变量的系数从而计算主成分pc1 = rc1*Xipc2 = rc2*Xi
14.3探索性因子分析
Xi=Aj*Fj+Ui
Xi是第i个观测变量
Fj是公共因子,j
14.3.1判断因子的数目
[code]library(psych)covariances=ability.cov$cov#将变量的协方差矩阵转成相关系数矩阵correlations=cov2cor(covariances)fa.parallel(correlations,n.obs=112,fa='both',n.iter=100, main='scree plots with parallel analysis')#选择前面两个因子
对于EFA,Kaiser-Harris准则是特征值>0,而不是>1。这一点和PCA不同。14.3.2提取公共因子
fa(r,nfactors=,n.obs=,rotate=,fm=)
r是相关系数矩阵或者原始数据矩阵
nfactors需要提取的因子数
n.obs观测数,输入相关系数矩阵时需要填写
rotate旋转的方法,默认是互变异数最小法
fm设定的因子化方法,默认是极小残差法
fm的其他选项:最大似然法(ml),主轴迭代法(pa),加权最小二乘法(wls),广义加权最小二乘法(gls),最小残差法(minres).
[code]# 未旋转的主轴迭代因子法fa = fa(correlations, nfactors=2,rotate='none',fm='pa')
14.3.3因子旋转
同样是为了更好地解释结果。
[code]# 用正交旋转提取因子fa.varimax=fa(correlations, nfactors=2, rotate='varimax',fa='pa')fa.varimax
[code]# 用斜交旋转提取因子fa.promax=fa(correlations, nfactors=2, rotate='promax',fa='pa')fa.promax
从结果看,正交旋转,因子分析的重点在于因子结构矩阵(变量与因子的相关系数),对于斜交旋转,则考虑三个矩阵:因子结构矩阵,因子模式矩阵,因子关联矩阵。
因子模式矩阵:即标准化的回归系数矩阵,列出因子预测变量的权重。
因子关联矩阵:即因子的相关系数矩阵。如果因子间的关联性很低,可以重新使用正交旋转的方法来简化问题。
14.3.4因子得分
EFA并不那么关注因子得分,但是也很简单,在提取公共因子或旋转因子的时候制定score=T即可。
[code]# 用正交旋转提取因子fa.varimax=fa(correlations, nfactors=2, rotate='varimax',fa='pa',score=T)fa.varimax$weight
12重抽样与自助法
15 缺失数据处理
识别缺失值
is.na()
!complete.cases()
VIM包
删除确实值
无效实例删除:omit.na()行删除
有效实例删除(配对删除法)
最大似然估计处理:mvmle包
插值填补:多重插补,MI包,Mice包,amelia包,mitools包
[code]data(sleep,package='VIM')#列出没有缺失值的行sleep[complete.cases(sleep),]#列出有一个或多个确实值的行sleep[!complete.cases(sleep),]
15.3探索确实值模式
15.3.1列表显式缺失值
[code]library(mice)data(sleep,package='VIM')md.pattern(sleep)# 0:表示变量中有缺失值,1表示没有。
15.3.2图像探索缺失值
[code]# aggr()不仅绘制每个变量的确实值数,还绘制变量组合的确实值数library('VIM')aggr(sleep,prop=FALSE,numbers=TRUE)
15.6行删除缺失值
[code]newdata=mydata[complete.cases(mydata),]#和na.omit()是一样的newdata=na.omit(mydata)
15.7多重插补(MI)
[code]library(mice)data(sleep,package='VIM')imp=mice(sleep,seed=1234) #设定随机数种子fit=with(imp,im(Dream~Span+Gest))pooled=pool(fit)summary(pooled)
15.8缺失值的其他处理方法
|
---|
软件包 | 描述 |
---|
Hmisc | 包含多种函数,支持简单插补,多重插补,和典型变量插补 |
mvnmle | 对多元正态分布数据中的缺失值的最大似然估计 |
cat | 对数线性模型中多元类别型变量的多重插补 |
arrayImpute、arrayMissPattern、SeqKnn | 处理微阵列缺失数据的使用函数 |
logittudinalData | 相关的函数列表,比如对时间序列缺失值进行插补的一系列函数 |
kmi | 处理生存分析缺失值的Kaplan-Meier多重插补 |
mix | 一般位置模型中混合类别型和连续性数据的多重插补 |
pan | 多元面板数据或聚类数据的多重插补 |