R语言做生信线性回归

回归分析

2018-12-26  本文已影响1人  我最有才

#广义线性模型-logistic 与泊松回归 Y值类型为0/1或者一些计数型的

#logistics-AER包,婚外情数据affairs,各种因素是不是跟婚外情有关系

data(Affairs,package = "AER")

#变量x的统计分析

summary(Affairs)

#相应变量y的统计数值

table(Affairs$affairs)

#这时候我们需要把婚外情变化成二值型数据0/1  只关心有没有  ynaffair可以任意取名字,新增的一列而已

Affairs$ynaffair[Affairs$affairs>0]<-1

Affairs$ynaffair[Affairs$affairs==0]<-0

Affairs$ynaffair<-factor(Affairs$ynaffair,levels = c(0,1),labels = c("No","Yes"))

table(Affairs$ynaffair)

##此时因为Y变为二值型变量0/1,可以用logistic回归了

fit<-glm(ynaffair~gender+age+yearsmarried+children+religiousness+education+occupation+rating,data=Affairs,family=binomial())

summary(fit)

#去除拟合不好的再拟合

fit_reduced<-glm(ynaffair~age+yearsmarried+religiousness+rating,data=Affairs,family=binomial())

summary(fit_reduced)

##因为fit_reduced拟合是fit拟合的子集,可以用卡方检验的anova进行比较  p>0.05,没有差别,因此可以删去无关的数据

anova(fit_reduced,fit,test = "Chisq")

##可以用coef单独看看系数

coef(fit_reduced)

##方法一:用优势比解释系数

##因为响应变量是Y=1的log值,不好解释,可以e-指数化后恢复原来的值;保持年龄什么的不变,婚龄增加一年,婚外情

    ##优势比乘于1.106.。。因此大于1,上升,小于1下降优势比  若分析几年,就乘于几年就好了*n --n年

exp(coef(fit_reduced))

##系数置信区间

confint(fit_reduced)

##指数化的结果--一般用这个

exp(confint(fit_reduced))

##方法二:用概率解释系数

##创建感兴趣的数据集

testdata<-data.frame(rating=c(1,2,3,4,5),age=mean(Affairs$age),yearsmarried=mean(Affairs$yearsmarried),

                    religiousness=mean(Affairs$religiousness))

testdata

testdata$prob<-predict(fit_reduced,newdata = testdata,type = "response")

testdata

##过度离势的判断,避免不准确的显著性检验

fit_reduced<-glm(ynaffair~age+yearsmarried+religiousness+rating,data=Affairs,family=binomial())

fit.od<-glm(ynaffair~age+yearsmarried+religiousness+rating,data=Affairs,family = quasibinomial())

#检验 >0.34,没有过度离势,之前的检验显著可信;

pchisq(summary(fit.od)$dispersion*fit_reduced$df.residual,fit_reduced$df.residual,lower=F)

##常见的回归诊断可以用线性回归诊断也可以用下面的

##一般方法:

op<-par(mfrow=c(2,2))

plot(fit_reduced)

par(op)

###本章的方法  预测值与残差值

plot(predict(fit_reduced,type = "response"),residuals(fit_reduced,type="deviance"))

###异常值--hat value  学生化残差,cook距离

plot(hatvalues(fit_reduced))

plot(rstudent(fit_reduced))

plot(cooks.distance(fit_reduced))

###泊松回归分析---robust包

library(robust)

data(breslow.dat,package = "robust")

names(breslow.dat)

summary(breslow.dat[c(6,7,8,10)])

##基本图形描述

op<-par(no.readonly = T)

par(mfrow=c(1,2))

attach(breslow.dat)

hist(sumY,breaks = 20,xlab = "Seizure Count",main = "Distribution of Seizures")

boxplot(sumY~Trt,xlab="Treatment",main="Group Comparisons")

par(op)

###回归拟合:

fit_BS<-glm(sumY~Base+Age+Trt,family = poisson(),data=breslow.dat)

summary(fit_BS)

###系数分析

coef(fit_BS)

##指数化

exp(coef(fit_BS))

##过度离势分析

##残差偏差与残差自由度比值  远远大于1  说明过度离势

deviance(fit_BS)/df.residual(fit_BS)

#或用qcc包中进行过度离势分析  p<0.05 进一步说明过度离势

library(qcc)

qcc.overdispersion.test(breslow.dat$sumY,type="poisson")

##将poisson换成quasipoisson 重新拟合

fit<-glm(sumY~Base+Age+Trt,family = quasipoisson(),data=breslow.dat)

summary(fit)

##########################################################

##第五题  回归分析

data_5<-read.table("final5/diabetes.txt",header = T,sep = "\t")

data_5<-as.data.frame(data_5)

boxplot(data_5)

library(car)

scatterplotMatrix(data_5,spread=F,main="Scatter Plot Matrix")

##拟合

fit_5<-lm(Y~X1+X2+X3+X4,data = data_5)

summary(fit_5)

#回归诊断--标准方法

op<-par(mfrow=c(2,2))

plot(fit_5)

par(op)

par(par(mfrow=c(2,2)))

##离群点

outlierTest(fit_5)

##逐步回归分析 P大于0.05可以删去x1 x2

fit_5_new<-lm(Y~X3+X4,data = data_5)

anova(fit_5,fit_5_new)

##交互作用

fit_5_ab<-lm(Y~X3+X4+X3:X4,data = data_5)

fit_5_ab

##交互结果展示

library(effects)

plot(effect("X3:X4",fit_5_ab),multiline=T)

上一篇下一篇

猜你喜欢

热点阅读