R 语言实战(第二版)

part 3 中级方法


-------------第8章 回归------------------

#概念:用一个或多个自变量(预测变量)来预测因变量(响应变量)的方法
#最常用:OLS——普通最小二乘回归法,包括简单线性回归、多项式回归、多元线性回归
#过程:拟合OLS回归模型——>评价拟合优度——>假设检验——>选择模型 #OLS回归
#目标:减少因变量的真实值和预测值的差值来获得模型参数(截距和斜率),即使得残差平方和最小
#数据需满足:正态性、独立性、线性、同方差性
myfit <- lm(formula,data)
#表达式符号:~/+/:/*/^/./-1/I()/function #拟合线性模型相关函数:
summary() #拟合模型详细结果
coefficients() #模型参数(截距和斜率)
confint() #模型参数置信区间(默认95%)
fitted() #模型预测值
residuals() #模型残差值
anova() #方差分析表
vcov() #模型参数的协方差矩阵
plot() #评价拟合模型诊断图
predict() #对新的数据集预测因变量 ##1.简单线性回归
head(women)
fit <- lm(weight~height,data=women)
summary(fit) #理解结果
women$weight
fitted(fit)
residuals(fit) #真实值与预测值之差
plot(women$height,women$weight)
abline(fit)
#模型等式:weight=-87.52+3.45*height
#图形表明可用含一个弯曲的曲线来提高预测精度 ##2.多项式回归
#注意不同于多元线性,它是n阶多项式,如x^2,x^3等,或者说它是多元线性回归的一个特例。
#多项式等式仍可认为是线性回归模型(加权和形式),非线性模型可用nls()函数拟合
#上例可通过添加一个二次项(即x^2)来提高回归模型精度
fit2 <- lm(weight~height+I(height^2),data = women)
summary(fit2)
plot(women$height,women$weight)
lines(women$height,fitted(fit2))
#p值、方差解释率都比原来模型要好。模型等式:weight=261.88-7.35*height+0.083*height^2 fit3 <- lm(weight~height+I(height^2)+I(height^3),data = women)
plot(women$height,women$weight)
lines(women$height,fitted(fit3))
#一般而言,n次多项式生成有n-1个弯曲的曲线,比三次更高的多项式几乎没有必要。 #快速绘制二元关系图
library(car)
scatterplot(weight~height,data=women,
spread=F, #删除残差正负均方根在平滑曲线的展开和对称信息
smoother.args=list(lty=2)) #设置拟合曲线为虚线 ##3.多元线性回归
states <- as.data.frame(state.x77[,c("Murder","Population",
"Illiteracy","Income","Frost")])
head(states)
##step 1:检查变量间相关性
cor(states)
car::scatterplotMatrix(states,spread=F,smoother.args=list(lty=2)) #因变量和自变量的散点图矩阵 ##step 2:拟合多元线性回归模型
fit <- lm(Murder~Population+Illiteracy+Income+Frost,data = states)
summary(fit)
#自变量多个时,回归系数含义为:一个自变量增加一个单位,其他自变量保持不变时,因变量将要增加的数量 ##有交互项的多元线性回归
fit <- lm(mpg~hp+wt+hp:wt,data = mtcars) #马力与车重
summary(fit)
#两个自变量交互项显著,说明因变量与其中一个自变量的关系依赖于另一个自变量 #交互项展示: 看二者关系到底如何变化
library(effects)
plot(effect("hp:wt",fit,,list(wt=c(2.2,3.2,4.2))),multiline = T) ##4.回归诊断
#对模型参数推断的信心依赖于在多大程度上满足OLS模型统计假设
fit <- lm(Murder~Population+Illiteracy+Income+Frost,data = states)
confint(fit)
#文盲率改变1%,谋杀率在95%的置信区间[2,38,5,90]内变化,Frost置信区间包含0,温度与谋杀率无关,但这些必须基于数据满足统计假设的前提。 ##1)标准方法
#最常用:对lm函数返回对象plot得到的四幅图,这四幅图反应了OLS回归的统计假设:正态性、独立性、线性、同方差性
fit <- lm(weight~height,data=women)
par(mfrow=c(2,2))
plot(fit)
#正态Q-Q图:正态性,需落在45度角直线上
#残差图和拟合图residuals vs fitted:线性,需无关联
#位置尺度图scale-location graph: 同方差性,点应随机分布
#残差与杠杆图residuals vs leverage: 离群点、杠杆值、强影响点 ##再看看二次拟合诊断图:
fit2 <- lm(weight~height+I(height^2),data=women)
par(mfrow=c(2,2))
plot(fit2)
#比之前理想一些 ##剔除异常值(需谨慎)
newfit <- lm(weight~height+I(height^2),data=women[-c(13,15),])
par(mfrow=c(2,2))
plot(newfit) fit <- lm(Murder~Population+Illiteracy+Income+Frost,data = states)
par(mfrow=c(2,2))
plot(fit)
#剔除Nevada离群点,模型假设更好的满足 ##2)改进方法
#car包titig提供了大量回归诊断函数
library(car)
qqPlot #分位数比较图
#正态性检验
qqPlot(fit,labels=row.names(states),
id.method="identify", #交互式绘图,用鼠标点,如实时查看异常值。按ESC,stop或右击图形退出该模式
simulate = T,main = "Q-Q plot") #误差的独立性检验
durbinWatsonTest(fit) #若p不显著,则误差项之间独立 #自变量和因变量的线性检验
crPlots(fit) #成分残差图
#若图形不是线性,说明需要添加一些曲线信息,如多项式或log转换等 #同方差性检验
ncvTest(fit) #若p不显著,说明方差不变
spreadLevelPlot(fit) #若方差稳定,将会一些水平趋势线 ##线性模型的综合检验
library(gvlma)
summary(gvlma(fit)) ##3)异常观测值
###离群点(预测不佳的观测点)
outlierTest(fit) #根据p值一次只能返回最大的那个离群点,只能删了该值才能继续检测 ###高杠杆值点(许多异常预测变量的组合)
#帽子统计量来判断 ###强影响点(对模型参数估计比例失衡的点)
#通过Cook距离(D统计量)或变量添加图来检测 ###整合离群点、杠杆值和强影响点到一幅图中
influencePlot(fit) ##5.改进模型
#删除观测点(谨慎):重新拟合
#变量变换:不符合正态性、线性或同方差性假设时。PS:若变换了变量,解释必须基于变换后的变量,而非初始变量
#增删变量:处理多重共线性时
#尝试其他方法:异常值——稳健回归模型,非正态——非参数回归模型,非线性——非线性回归模型,不同方差——时间序列模型或多层次回归模型 ##6.选择最佳的模型
#回归模型的选择总会涉及到:预测精度和模型简洁度的调和问题
##1)两个模型比较
#anova方法:需要嵌套模型
fit1 <- lm(Murder~Population+Illiteracy+Income+Frost,data=states)
fit2 <- lm(Murder~Population,data = states) #fit1和fit2是嵌套模型(一个的项包含另一个)
anova(fit1,fit2) #不显著,说明可以将后两项不加入线性模型中 #AIC方法:不需嵌套模型
AIC(fit1,fit2) #直接根据AIC值判断(越小越好) ##2)变量选择
#逐步回归法:
#模型一次添加(向前)或删除(向后)一个变量,直至判停。通常结合两者。
#可能会找到一个好模型,但不能保证是最佳模型,因为没有评价所有可能模型。
library(MASS)
stepAIC(fit,direction = "backward") #变量从多到少,直到找到最小的AIC #全子集回归:
#所有可能的模型都会被检验。R平方含义是自变量解释因变量的程度,调整R平方考虑了模型参数数目。
#一般要优于逐步回归,但预测变量太多时,速度很慢。
#方法1
library(leaps)
leaps <- regsubsets(Murder~Population+Illiteracy+Income+Frost,data = states,nbest = 4)
plot(leaps,scale = "adjr2") #纵轴调整R平方
#方法2
library(car)
subsets(leaps,statistic = "cp") #交互绘图,鼠标点图例
abline(1,1,lty=2,col="red") #模型越好,离这条直线越近 ##6.交叉验证
#评价回归方程的泛化能力
#概念:挑出一定比例数据作为训练样本,其他样本作保留样本,先在训练样本上获得回归方程,再在保留样本上预测。
#k重交叉验证:样本被分为k个子集,轮流将k-1个子集组合作为训练集,另一个子集作为保留集,这样得到的k个预测方程,记录k个保留集的预测结果,再求均值。
#bootstrap::crossval函数
shrinkage <- function(fit,k=10){
library(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]
results <- crossval(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")
cat(k,"fold cross validated R square =",r2cv,"\n")
cat("change =",r2-r2cv,"\n")
}
shrinkage(fit1) #每次都会有少许不同
#比较验证前R平方和交叉验证后R平方,R平方减少得越少,预测越精确 shrinkage(fit2)
#fit2模型的R平方减少的更少,可见fit2模型更好 ##变量的相对重要性
#大部分情况下,自变量(预测变量)之间都有一定相关性,因此需要对自变量的重要性进行排序,即比较标准化后的回归系数
zstates <- as.data.frame(scale(states)) #lm函数需要数据框格式
zfit <- lm(Murder~Population+Illiteracy+Income+Frost,data = zstates)
coef(zfit) #可以看出,Illiteracy最大 ##相对权重方法(relwights函数代码见书)
relweights(fit) ##总结:回归分析是很多方法的总称,包括拟合模型、假设检验、修正模型、再拟合等过程

---------------------第9章 方差分析---------------------------------------------

##1)术语
#anova
#单因素方差分析:1个类别型变量,分为组间(因素)和组内(水平),通过F检验评价,均衡设计(观测数相同)和非均衡设计
#双因素方差分析:两个因子(如时间和疗法),主效应(两个因子的影响),交互效应(交互影响),双因素混合模型方差分析(包括组间和组内设计)
#多因素方差分析:多个因子
#协方差分析:ancova,即存在混淆因素,干扰变数,如抑郁症干扰焦虑症
#多元方差分析:manova,2个及其以上个因变量
#多元协方差分析:mancova,即存在协变量的多元方差分析 ##2)anova模型拟合
#方差分析是广义线性模型的特例,lm函数也能分析,aov函数与之等同
#表达式:小写字母定量,大写字母组别
y~A #单因素anova
y~x+A #单个协变量的单因素ancova
y~A*B #双因素anova
y~x1+x2+A*B #含两个协变量的 双因素ancova
y~B+A #随机化区组(B是区组因子)
y~A+Error(Subject/A) #单因素组内anova
y~B*W+Error(Subject/W) #含单个组内因子(W)和单个组间因子(B)的重复测量anova #R默认序贯型方法计算anova效应:y~A+B+A:B(A对y的影响;控制A时,B对y的影响;控制A和B主效应时,A和B的交互效应)
#样本大小越不平衡,效应项的顺序对结果影响越大
#基本准则:若研究设计不是正交的(因子和协变量相关),一定要谨慎设置效应的顺序 ##3)单因素方差分析
library(multcomp)
attach(cholesterol)
cholesterol #五种疗法
table(trt)
aggregate(response,by=list(trt),mean)
aggregate(response,by=list(trt),sd)
fit <- aov(response~trt)
summary(fit) #p<0.01,F检验显著,说明五种疗法效果不同,但不知哪种显著差异 library(gplots)
plotmeans(response~trt) #各组均值及其置信区间
detach(cholesterol) ##多重比较
###方法1:
TukeyHSD(fit) #各组比较结果 par(las=2) #旋转轴标签
par(mar=c(5,8,4,2))
plot(TukeyHSD(fit)) #置信区间包含0的说明不显著 ###方法2:
tuk <- multcomp::glht(fit,linfct=mcp(trt="Tukey"))
plot(cld(tuk,level = 0.05), #0.05显著水平(95%置信区间)
col="lightgrey") #有相同字母的均值差异不显著 ##方差分析假设检验条件
###正态性:qq图
qqPlot(lm(response~trt,data = cholesterol),
simulate=T) #数据落在95%置信区间范围,满足正态性(只能大致判断)
###方差齐性:
bartlett.test(response~trt,data = cholesterol) #各组方差无显著性差异,满足条件 #方差齐性对离群点很敏感,检测离群点:
car::outlierTest(fit) #p>1时产生NA ##3)单因素协方差分析
data(litter,package = "multcomp")#4组怀孕小鼠,用4种不同剂量的药物对幼崽出生体重的影响,怀孕时间为协变量
help(litter,package = "multcomp")
attach(litter)
table(dose)
aggregate(weight,by=list(dose),mean)
fit <- aov(weight~gesttime+dose)
summary(fit)
#F检验怀孕时间和药物剂量都显著 #去除协变量效应后的组均值
library(effects)
effect("dose",fit) #多重比较
multcomp::glht() #假设检验条件
#方差齐性和正态性检验与方差分析类似,另外还要检验回归斜率的同质性
fit2 <- aov(weight~gesttime*dose,data = litter)
summary(fit2)
#交互效应不显著,说明斜率相等 #可视化
library(HH)
ancova(weight~gesttime+dose,data=litter)
#回归线(斜率)相互平行,截距不同 ##4)双因素方差分析
help("ToothGrowth")
head(ToothGrowth)#两种喂食方法,分别3种抗坏血酸含量水平,对牙齿长度影响
attach(ToothGrowth)
table(supp,dose)
aggregate(len,by=list(supp,dose),mean)
aggregate(len,by=list(supp,dose),sd)
fit <- aov(len~supp*as.factor(dose)) #剂量要转换为因子变量,这样才是分组变量,而非数值型协变量
summary(fit) #主效应和交互效应都显著 #交互效应可视化
interaction.plot(dose,supp,len,type = "b",col = c("red","blue"),pch = c(16,18))
#或
gplots::plotmeans(len~interaction(supp,dose,sep=" "),
connect = list(c(1,3,5),c(2,4,6)),
col = c("red","darkgreen")) #展示了均值、误差棒(95%置信区间)和样本大小 #所有结果可视化(包括主效应和交互效应)
HH::interaction2wt(len~supp*dose) #同样可用于展示多因素方差分析 detach(ToothGrowth) ##5)重复测量方差分析、多元方差分析 略 ##6)用回归来做anova
#anova和回归都是广义线性模型的特例
library(multcomp)
head(cholesterol)
levels(cholesterol$trt)
#anova拟合
summary(aov(response~trt,data = cholesterol))
#lm拟合
summary(lm(response~trt,data = cholesterol))
##线性模型要求自变量为数值型,所以当lm碰到因子时,会用与因子水平对应的数值型来代替因子,如trt有5个因子水平,它会创建4个对照变量
##这里对照没搞懂?

-------------------------第10章 功效分析-----------------------------

#即在一定置信度下,需要多少样本量才能检测到效应值?
#功效分析针对的是假设检验 ##1)假设检验基本概念
#零假设H0,备择假设H1,显著性水平。样本统计量来推断总体参数
#I型错误(拒绝了真实的零假设,假阳性错误),II型错误(没拒绝错误的零假设,假阴性错误)
#关注4个量:给定任意3个,可推算第4个
#样本大小——观测数目
#显著性水平——假阳性概率
#功效——1-假阴性概率
#效应值——备择假设下效应的量 ##2)pwr包做功效分析
library(pwr)
#一般先根据各种检验的各自方法计算出效应值,再计算所需样本量 #①t检验
pwr.t.test(n = ,d = ,sig.level = ,power = ,type = ,alternative = )
##n样本大小,d为功效值(标准化的均值之差),sig.level显著性水平,power功效水平,type检验类型(单样本/双样本),alternative双侧/单侧检验(less/greater) pwr.t.test(d=.8,sig.level = .05,power = .9,type = "two.sample",alternative = "two.sided")
#计算n样本(每组需要的样本量) pwr.t.test(n = 20,d=.5,sig.level = .01,type = "two.sample",alternative = "two.sided")
#计算功效水平power #两样本大小不等的t检验
pwr.t2n.test(n1=,n2=,d=,sig.level = ,power = ,alternative = ) #②方差分析
pwr.anova.test(k=,n=,f=,sig.level = ,power = )
#k是组的个数,n是各组样本大小,f是效应值(公式略),sig.level显著水平,power功效水平 pwr.anova.test(k=5,f=0.25,sig.level = 0.05,power = 0.8)
#计算各组需要的样本量n #③相关性
pwr.r.test(n=,r=,sig.level = ,power = ,alternative = )
#r为效应值(线性相关系数) pwr.r.test(r=0.25,sig.level = 0.05,power = 0.9,alternative = "greater")
#计算样本量n #④线性模型
pwr.f2.test(u=,v=,f2=,sig.level = ,power = )
#u分子自由度,v分母自由度,f2是效应值(公式有两种,略) pwr.f2.test(u=3,f2=0.0769,sig.level = 0.05,power = 0.9)
#计算样本量 #⑤比例检验
pwr.2p.test(h=,n=,sig.level = ,power = ) #h为效应值,n为各组相同的样本量 #⑥卡方检验:一般用来评价两个类别型变量的关系(是否独立)
pwr.chisq.test(w=,N=,df=,sig.level = ,power = )
#w效应值,N总样本量,df自由度 #功效分析中,预期效应值是最难决定的参数,需要对主题有一定的经验和了解。
#Cohen效应值基准:可划分为小、中、大三种效应值 #⑦绘制功效分析图形
#检验各种效应值下相关性所需的样本量曲线
library(pwr)
#生成一系列相关系数和功效值
r <- seq(0.1,0.5,0.01) #相关系数
nr <- length(r)
p <- seq(0.4,0.9,0.1) #功效值
np <- length(p)
#获取样本大小
samsize <- array(numeric(nr*np),dim = c(nr,np)) #先建立空的样本矩阵,再用循环填充
for(i in 1:np){
for (j in 1:nr) {
result <- pwr.r.test(n=NULL,r=r[j],sig.level = 0.05,power = p[i],alternative = "two.sided")
samsize[j,i] <- ceiling(result$n) #向上取整
}
}
#创建图形
xrange <- range(r)
yrange <- round(range(samsize))
colors <- rainbow(length(p))
plot(xrange,yrange,type = "n")
#添加功效曲线
for (i in 1:np) {
lines(r,samsize[,i],type = "l",lwd=2,col=colors[i])
}
#添加网格线
abline(v=0,h=seq(0,yrange[2],50),lty=2,col="grey89")
abline(h=0,v=seq(xrange[1],xrange[2],0.02),lty=2,col="gray89")
#添加注释
title("test\nSig=0.05 (Two-tailed)")
legend("topright",title = "power",as.character(p),fill = colors) #基因研究中功效分析的R包:
#powerGWASinteraction pedantics gap ssize.fdr

----------------------第11章 中级绘图--------------------------------

##二元变量和多元变量关系的可视化

#1.散点图
##基本散点图
attach(mtcars)
plot(wt,mpg,
main = "scater plot of mpg vs weight",
xlab = "car weight",
ylab = "miles per gallon",
pch=19
)
abline(lm(mpg~wt),col="red",lwd=2,lty=1) #添加线性拟合直线
lines(lowess(wt,mpg),col="blue",lwd=2,lty=2) #添加lowess拟合曲线(R语言中还有一个loess平滑曲线拟合函数) library(car)
scatterplot(mpg~wt | cyl,data=mtcars, #按条件绘图(即按cyl的水平分别绘制前两者关系图)
lwd=2,span=0.75, #span控制loess曲线平滑量
legend.plot=T,
id.methods="identify", #鼠标单击交互
#labels=row.names(mtcars),
boxplots="xy") #边界箱线图 ##散点图矩阵
pairs(~mpg+disp+drat+wt,data=mtcars)
pairs(~mpg+disp+drat+wt,data=mtcars,upper.panel=NULL) #只展示一边(另一半完全相同)
pairs(~mpg+disp+drat+wt,data=mtcars,lower.panel=NULL) library(car)
scatterplotMatrix(~mpg+disp+drat+wt,data=mtcars,
spread=F, #不添加展示分散度和对称信息的直线
smoother.args=list(lty=2)) #平滑(loess)拟合曲线为虚线
#为何每个图有三条平滑曲线? ##高密度散点图
#当数据点重叠很严重时用普通散点图很难识别哪里数据点密度大
set.seed(123)
mydata <- as.data.frame(rbind(matrix(rnorm(10000,0,0.5),ncol = 2),
matrix(rnorm(10000,3,2),ncol = 2)))
names(mydata) <- c("x","y")
head(mydata)
with(mydata,plot(x,y,pch=19)) #smoothScatter用核密度估计生成颜色密度
with(mydata,smoothScatter(x,y)) library(hexbin)
with(mydata,plot(hexbin(x,y,xbins=50))) ##三维散点图
#三个定量变量的交互关系
attach(mtcars)
library(scatterplot3d)
s3d <- scatterplot3d(wt,disp,mpg,
pch=16,
highlight.3d = T,
type = "h") s3d$plane3d(lm(mpg~wt+disp)) #添加一个回归面(代表预测值) ##旋转三维散点图: 可交互
library(rgl)
plot3d(wt,disp,mpg,col="red",size=5) library(car)
with(mtcars,scatter3d(wt,disp,mpg)) ##气泡图
#创建二维散点图,再用点大小表示第三个变量
symbols(wt,mpg,circle=sqrt(disp/pi),
inches = 0.3, #比例因子
fg="white",bg="lightblue")
text(wt,mpg,rownames(mtcars),cex = 0.6) #2.折线图
##两个函数plot(x,y,type=)或lines(x,y,type=)
help(Orange)
opar <- par(no.readonly = T)
par(mfrow=c(1,2))
t1 <- subset(Orange,Tree==1)
plot(t1$age,t1$circumference)
plot(t1$age,t1$circumference,type="b") #类型有p/l/o/b/n/c/s/h等
par(opar) #可用plot函数先创建空图形(轴标签、轴范围等),再用lines函数添加数据点
#例子:展示五种橘树随时间推移的生长状况的折线图 <学习编程思维>
Orange$Tree <- as.numeric(Orange$Tree)
ntrees <- max(Orange$Tree)
#创建图形
xrange <- range(Orange$age)
yrange <- range(Orange$circumference)
plot(xrange,yrange,type="n",
xlab="Age (days)",
ylab="Circumference (mm)")
colors <- rainbow(ntrees)
linetype <- c(1:ntrees)
plotchar <- seq(18,18+ntrees,1) #点类型
#添加线条
for (i in 1:ntrees) {
tree <- subset(Orange,Tree==i)
lines(tree$age,tree$circumference,
type = "b",lwd=2,
lty=linetype[i],col=colors[i],pch=plotchar[i])
}
title("Tree growth","example of line plot")
#添加图例
legend(xrange[1],yrange[2], #位置(但这里好像不对?)
1:ntrees,
cex = 0.8,title = "Tree",
col = colors,lty = linetype,pch = plotchar) #3.相关图
options(digits = 2)
cor(mtcars)
library(corrgram)
corrgram(mtcars,order = T, #行列重排序,将相似相关的变量聚在一起(使用主成分法)
lower.panel = panel.shade, #阴影深度表相关性大小
upper.panel = panel.pie, #饼图比例表相关性大小
text.panel = panel.txt, #变量名
main="corrgram of mtcars inttercorrelations"
)
#蓝色(斜向上)正相关,红色(斜向下)负相关。还可对主对角线进行设置 corrgram(mtcars,order = T,lower.panel = panel.ellipse, #置信椭圆和平滑曲线
upper.panel = panel.pts, #散点图
diag.panel = panel.minmax, #输出最大最小值
text.panel = panel.txt) corrgram(mtcars,lower.panel = panel.shade,
upper.panel = NULL, #只展示半边
text.panel = panel.txt) corrgram(mtcars,lower.panel = panel.shade,order = T,
upper.panel = NULL, text.panel = panel.txt,
col.regions = colorRampPalette(c("red","yellow","blue","green"))) #指定颜色 #4.马赛克图
#展示多个类别型变量的关系
ftable(Titanic) #紧凑列联表 library(vcd)
mosaic(ftable(Titanic))
mosaic(Titanic,shade = T,legend=T)#泰坦尼克号船舱等级、性别、年龄和幸存者关系,信息量很大
#等同于
mosaic(~Class+Sex+Age+Survived,data=Titanic,shade = T,legend=T) #更可控个性化
mosaic(~Class+Sex+Survived,data=Titanic,shade = T,legend=T)

------------------------第12章 重抽样与自助法----------------------------------------

#当不满足统计假设(未知/混合分布、样本过小、离群点等)时,基于随机化和重抽样统计方法适用
#1.置换检验
#也叫随机化检验,将统计量与置换观测后的经验分布(而非理论分布)进行比较,根据统计量值的极端性判断是否拒绝零假设
#经验分布依据所有可能的排列组合,称为精确检验(只适合样本)
#从所有可能的排列中进行抽样获得近似的检验,称为蒙特卡洛模拟
#置换检验需要设定随机数种子,便于结果重现 #两个用于置换检验的R包:
#coin包对于独立性问题提供全面的置换检验的框架
#lmPerm包专门用来做方差分析和回归分析的置换检验 #2)coin包
#可解决独立性的问题:因变量和组别分配独立吗?两个数值变量独立吗?两个类别变量独立吗?
#coin包提供的函数与传统检验类似 ##①两样本检验
library(coin)
score <- c(40,57,45,55,58,57,64,55,62,65)
treatment <- factor(c(rep("A",5),rep("B",5))) #coin包中类别和序数变量都要转化为因子
mydata <- data.frame(treatment,score)
#传统t检验
t.test(score~treatment,data = mydata,var.equal=T)
#置换检验
oneway_test(score~treatment,data = mydata,distribution="exact") #精确检验
#尽管t检验p值显著,置换检验不显著,但由于样本量小,反而更相信置换检验的结果 ##②K样本置换检验
library(multcomp)
set.seed(1234)
oneway_test(response~trt,data = cholesterol,
distibution=approximate(B=9999)) #置换9999次,p显著 ##③列联表的独立性
library(vcd)
Arthritis
Arthritis <- transform(Arthritis,Improved=as.factor(as.numeric(Improved)))
#将Improved从一个有序因子变成一个分类因子,因为是做卡方检验,而非趋势检验
set.seed(1234)
chisq_test(Treatment~Improved,data = Arthritis,
distribution=approximate(B=9999)) ##④数值变量间的独立性
set.seed(123)
spearman_test(Illiteracy~Murder,data=as.data.frame(state.x77),
distribution=approximate(B=9999)) ##⑤两样本和K样本相关性检验
#两配对样本置换检验:
library(MASS)
wilcoxsign_test(U1~U2,data=UScrime,distribution="exact")
#多于两组时:
friedman_test() #3)lmPerm包
#用于做线性模型的置换检验
#lmp和aovp函数对应正态理论检验的lm和aov函数,多一个perm=参数,可选Exact(精确检验,样本量小于10)/Prob/SPR(贯序概率比) ##①简单回归和多项式回归
library(lmPerm)
set.seed(123)
fit <- lmp(weight~height,data = women,perm = "Prob") #简单回归
summary(fit) set.seed(1234)
fit <- lmp(weight~height+I(height^2),data = women,perm = "Prob") #多项式回归
summary(fit) #结果和lm函数类似,多一栏Iter列出要达到判停所需的迭代次数 ##②多元回归
set.seed(12345)
fit <- lmp(Murder~Population+Illiteracy+Income+Frost,
data=as.data.frame(state.x77),perm = "Prob")
summary(fit)
#与第8章lm函数结果不同 ##③单因素方差分析和协方差分析
library(multcomp)
set.seed(1234)
fit <- aovp(response~trt,data = cholesterol,perm = "Prob")
anova(fit) fit <- aovp(weight~gesttime+dose,data = litter,perm = "Prob")
anova(fit) ##④双因素方差分析
fit <- aovp(len~supp*dose,data=ToothGrowth,perm = "Prob")
anova(fit) #置换检验适合处理非正态数据、存在离群点、样本很小或者无法做参数检验等情况。有助于"效应是否存在"这样的问题。
#置换方法对于获取置信区间和估计测量精度比较困难,自助法派上用场。 #2.自助法
#初始样本重复随机抽样,生成一个或一系列待检验统计量的经验分布,无需假设理论分布,便可生成统计量的置信区间,并能检验统计假设
#boot包中的boot()函数和boot.ci()函数
#疑问:统计量有哪些?R平方,回归系数,summary函数结果等 ##1)单个统计量的自助法
#获取R平方函数
rsq <- function(formula,data,indices){
fit <- lm(formula,data=data[indices,])
return(summary(fit)$r.square)
}
#做大量自助抽样
library(boot)
set.seed(123)
results <- boot(data=mtcars,statistic = rsq,
R=1000,formula=mpg~wt+disp) #自助1000次
#输出对象
print(results)
#绘制结果
plot(results)
#获取95%置信区间
boot.ci(results,type = c("perc","bca")) #perc和bca两种方法得到的结果略有不同 #2)多个统计量的自助法
bs <- function(formula,data,indices){
fit <- lm(formula,data=data[indices,])
return(coef(fit))
}
results <- boot(data = mtcars,statistic = bs,
R=1000,formula=mpg~wt+disp)
print(results)
plot(results,index = 2)
boot.ci(results,type = "bca",index = 2)
boot.ci(results,type = "bca",index = 3) #置换检验和自助法不是万能的,烂数据无法转化为好数据。

R 语言实战-Part 3 笔记的更多相关文章

  1. 《R语言实战》读书笔记--为什么要学

    本人最近在某咨询公司实习,涉及到了一些数据分析的工作,用的是R语言来处理数据.但是在应用的过程中,发现用R很不熟练,所以再打算学一遍R.曾经花一个月的时间看过一遍<R语言编程艺术>,还用R ...

  2. R 语言实战-Part 4 笔记

    R 语言实战(第二版) part 4 高级方法 -------------第13章 广义线性模型------------------ #前面分析了线性模型中的回归和方差分析,前提都是假设因变量服从正态 ...

  3. R语言实战-Part 2笔记

    R 语言实战(第二版) part 2 基本方法 -------------第6章 基本图形------------------ #1.条形图 #一般是类别型(离散)变量 library(vcd) he ...

  4. R 语言实战-Part 5-1笔记

    R 语言实战(第二版) part 5-1 技能拓展 ----------第19章 使用ggplot2进行高级绘图------------------------- #R的四种图形系统: #①base: ...

  5. R 语言实战-Part 5-2笔记

    R 语言实战(第二版) part 5-2 技能拓展 ----------第21章创建包-------------------------- #包是一套函数.文档和数据的合集,以一种标准的格式保存 #1 ...

  6. 《R语言实战》读书笔记--第一章 R语言介绍

    1.典型的数据分析过程可以总结为一下图形: 注意,在模型建立和验证的过程中,可能需要重新进行数据清理和模型建立. 2.R语言一般用 <- 作为赋值运算符,一般不用 = ,原因待考证.用-> ...

  7. 《R语言实战》读书笔记 第七章--基本统计分析

    在导入数据并且将数据进行组织和初步可视化以后,需要对数据进行分布探索和两两关系分析等.主要内容有描述性统计分析.频数表和列联表.相关系数和协方差.t检验.非参数统计. 7.1描述性统计分析 7.1.1 ...

  8. 《R语言实战》读书笔记--第五章 高级数据管理

    本章内容: 数学和统计函数 字符处理函数 循环和条件执行 自编函数 数据整合与重塑 5.1一个数据处理难题 5.2数值和字符处理函数 分为数值函数和字符串函数,下面是数学函数截图: ceiling.f ...

  9. 《R语言实战》读书笔记--第四章 基本数据管理

    本章内容: 操纵日期和缺失值 熟悉数据类型的转换 变量的创建和重编码 数据集的排序,合并与取子集 选入和丢弃变量 多说一句,数据预处理的时间是最长的……确实是这样的,额. 4.1一个示例 4.2创建新 ...

随机推荐

  1. LCP 07.传递消息

    题目 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: 有 n 名玩家,所有玩家编号分别为 0 - n-1,其中小朋友 A 的编号为 0 每个玩家都有固定的若干个可传信息的其他玩家(也可 ...

  2. 什么是Sprint计划?

    Sprint 计划是Scrum框架中的一个事件,团队将确定他们将在冲刺期间处理的产品积压项目,并讨论他们完成这些产品积压项目的初始计划. 团队可能会发现建立冲刺目标很有帮助,并以此为基础确定他们在冲刺 ...

  3. BUAA软件工程个人博客作业

    软件工程个人博客作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标 团队完成好的软件,并对自己作出规划 这个作 ...

  4. 基于live555开发嵌入式linux系统的rtsp直播服务

    最近要搞一个直播服务,车机本身是个前后双路的Dvr,前路1080P 25fps,后路720P 50fps,现在要连接手机app预览实时画面,且支持前后摄像头画面切换. 如果要做直播,这个分辨率和帧率是 ...

  5. PE头详细分析

    目录 PE头详细分析 0x00 前言 0x01 PE文件介绍 0x02 PE头详细分析 DOS头解析 NT头解析 标准PE头解析 可选PE头解析 可选PE头结构 基址 代码段地址 数据段地址 OEP程 ...

  6. PWN环境搭建

    目录 PWN环境搭建 需要的工具或系统 安装PWN工具 pwntools (CTF库.漏洞利用库) pwngdb(GDB插件) checksec(查保护) ROPGadget(二进制文件查找工具) o ...

  7. K8s 离线集群部署(二进制包无dashboard)

    https://www.cnblogs.com/cocowool/p/install_k8s_offline.html https://www.jianshu.com/p/073577bdec98 h ...

  8. Cobar SQL审计的设计与实现

    背景介绍 Cobar简介 Cobar 是阿里开源的一款数据库中间件产品. 在业务高速增长的情况下,数据库往往成为整个业务系统的瓶颈,数据库中间件的出现就是为了解决数据库瓶颈而产生的一种中间层产品. 在 ...

  9. k8s入坑之路(11)kubernetes服务发现

    kubernetes访问场景 1.集群内部访问 2.集群内部访问外部 3.集群外部访问内部 1.集群内部访问 1.pod之间直接ip通讯(利用calico通过路由表经过三层将ip流量转发)由于容器之间 ...

  10. [第二章]c++学习笔记2(类和对象的基础3)

    隐藏的概念 隐藏的作用 使用例 成员函数的重载与缺省(附使用例) 注意事项