回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析

一般线性回归---完整过程

##线性回归包括几个方面:数据观察,初步拟合,交互作用,多重共线性,回归诊断,拟合中出现的离群点,杠杆值,强影响点,删除后,重新拟合,模型比较--之后可能要预测,因此需要数据交叉验证分成2部分,一部分拟合,一部分验证。

数据为state.x77数据集---本次利用ols 最小二乘法=最小平方法直线回归拟合分析

回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第1张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第2张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第3张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第4张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第5张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第6张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第7张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第8张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第9张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第10张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第11张图片

###线性回归

##线性回归包括几个方面:数据观察,初步拟合,交互作用,多重共线性,回归诊断,拟合中出现的离群点,杠杆值,强影响点,删除后,重新拟合,模型比较--

##之后可能要预测,因此需要数据交叉验证分成2部分,一部分拟合,一部分验证。

rm(list = ls())

gc()

library(car)

###本次利用ols 最小二乘法=最小平方法直线回归拟合分析---数据来自于state.x77数据集

state.x77

data<-state.x77

data<-as.data.frame(data)  ###lm一定要data.frame格式

###先看看数据特点  car包的scatterplotMatrix()

data1<-data[,c("Murder","Population","Income","Illiteracy","Frost","Area")]

scatterplotMatrix(data1)

###线性拟合

fit<-lm(formula = Murder ~ Population +Income+Illiteracy+Frost +Area, data = data)

###多重共线性:sqrt(vif(fit))>2那一列 删去

sqrt(vif(fit))

summary(fit)  ###Population  Illiteracy 具有与murder的线性关系

###看看之间是不是具有交互项

summary(lm(Murder~Population+Illiteracy+Population:Illiteracy,data=data))  ###没有交互项

summary(lm(Murder~Population+Illiteracy,data=data))  ##公式为:Murder=1.652e+00+2.242e-04*Population+4.081e+00*Illiteracy

###残差-回归诊断 线性 正态性 独立性 方差齐性

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

plot(lm(Murder~Population+Illiteracy,data=data))  ## 没有强影响点(没有大的cook值),Nevada>2(y值)为离群点,删去离群点

par(op)

###删去Nevada 重新拟合

rownames(data)

data2<-data[rownames(data)!="Nevada",]

summary(lm(Murder~Population+Illiteracy,data=data2))

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

plot(lm(Murder~Population+Illiteracy,data=data2))  ## 没有强影响点(没有大的cook值),Nevada>2(y值)为离群点,删去离群点

par(op)

###改进的残差分析

class(data2)

str(data2)

fit_1<-lm(Murder~Population+Illiteracy,data=data2)

qqPlot(fit_1,id.method="identify",labels=row.names(data2)) ###qqplot正态性检验

durbinWatsonTest(fit_1)  ##独立性 durbin-watson检验 p>0.05,残差独立

crPlots(fit_1)  ###线性

ncvTest(fit_1)  ###方差齐性 p>0.05

spreadLevelPlot(fit)  ###方差齐性作图 水平随机分布的直线

###异常观察值检测 -总和方法

influencePlot(fit_1,id.method="identify")

###最佳回归模型确定--全子集回归

library(leaps)

leaps<-regsubsets(Murder ~ Population +Income+Illiteracy+Frost +Area, data = data,nbest = 5)

plot(leaps,scale="adjr2")  ##最好是2个自变量x

library(car)

subsets(leaps,statistic = "cp")

abline(1,1,lty=2,col="red")

###以上分析只是为了在数据基础上建模和解释参加模拟的数据;如果要模拟的曲线用来预测将要出来的数据时怎么办?-深度分析之交叉验证

  ##交叉验证--9成数据来模拟,1成数据来验证

##set.seed()保证操作的可重复性,别人也用1234,产生的随机数就和你的一样了

set.seed(1234)

##选取训练集--从nrow(df)中即699个数字中,无放回(如果放回,replace=T)抽取0.7*nrow(df)个数字

train<-sample(nrow(data),0.7*nrow(data))

##提取出训练集的列表

df.train<-data[train,]

###提取验证集的列表

df.validate<-data[-train,]

##看看各个列表的数目

table(df.train$Murder)

table(df.validate$Murder)

##拟合:

fit_logit<-lm(Murder~.,data = df.train,family = binomial())

summary(fit_logit)

##用模拟的数据在新的数据集中,进行数据的验证: type = "response" 直接返回预测的概率值0~1之间

prob<-predict(fit_logit,df.validate,type="response")

prob

#3将概率大于0.5的定义为恶性肿瘤;概率小于0.5的定义为良性肿瘤,

logit.pred<-factor(prob>.5,levels = c(FALSE,TRUE),labels = c("benign","malignant"))

logit.pred

##3得出实际与预测的交叉表

logit.perf<-table(df.validate$class,logit.pred,dnn=c("Actual","Predicted"))

###预测出118个良,76个恶性

####  准确率为(76+118)/(129+81)=0.92 (76+118)/200=0.97

(76+118)/(129+81) ###有问题

(76+118)/200

###再回归来看 有几个模拟概率>0.05,不满足,可以删除再模拟,也可以用下面的方法

logit.fit.reduced<-step(fit_logit)

###哪个x值贡献最大呢?scale先规范化为均值为1,方差为0的数据集

data_3<-scale(data)            #scale数据

data_3<-as.data.frame(data_3)

coef(lm(formula = Murder ~ Population +Income+Illiteracy+Frost +Area, data = data_3))



数据如下:

A B

25 7

25 9

25 9

27 12

27 14

27 16

24 16

30 14

30 16

31 16

30 17

31 19

30 21

28 24

32 15

32 16

32 17

32 25

34 27

34 15

34 15

35 15

35 16

34 19

35 18

36 17

37 18

38 20

40 22

39 25

43 24

 setwd("c:/Users/xx/Desktop/Homework_4A/")

> data<-read.table(file ="data_1.txt",header=T,sep = "\t")

> ##散点图

> attach(data)

The following objects are masked from data (pos = 5):


    A, B


The following objects are masked from data (pos = 6):


    A, B


The following objects are masked from data (pos = 8):


    A, B


> ###pearson线性相关关系分析

> cor.test(data$A,data$B)


Pearson's product-moment correlation


data:  data$A and data$B

t = 4.1427, df = 29, p-value = 0.0002712

alternative hypothesis: true correlation is not equal to 0

95 percent confidence interval:

 0.3257757 0.7927878

sample estimates:

      cor 

0.6097313 


> pic<-lm(B~A,data = data)

> print(pic)


Call:

lm(formula = B ~ A, data = data)


Coefficients:

(Intercept)            A  

    -2.3350       0.6113  


> summary(pic)


Call:

lm(formula = B ~ A, data = data)


Residuals:

    Min      1Q  Median      3Q     Max 

-5.9469 -2.4765 -0.6145  1.4137  9.2193 


Coefficients:

            Estimate Std. Error t value Pr(>|t|)    

(Intercept)  -2.3350     4.7717  -0.489 0.628274    

A             0.6113     0.1476   4.143 0.000271 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 3.831 on 29 degrees of freedom

Multiple R-squared:  0.3718, Adjusted R-squared:  0.3501 

F-statistic: 17.16 on 1 and 29 DF,  p-value: 0.0002712


> #拟合直线

> plot(B~A,data=data)

> abline(pic)


回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第12张图片

> anova(pic)

Analysis of Variance Table


Response: B

          Df Sum Sq Mean Sq F value    Pr(>F)    

A          1 251.85 251.846  17.162 0.0002712 ***

Residuals 29 425.57  14.675                      

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

> ##拟合直线诊断-残差分析:标准方法

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

> plot(pic)

> par(op)


回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第13张图片

> ###改进的回归拟合诊断方法:

> ##正态性检验

> qqPlot(pic,id.method="identify",simlabels=row.names(data),ulate=TRUE,main="Normal Q-Q Plot")

[1] 14 19

> ###残差独立性检验 p>0.05,独立

> library(car)

> durbinWatsonTest(pic)

 lag Autocorrelation D-W Statistic p-value

   1       0.4027404      1.111413   0.008

 Alternative hypothesis: rho != 0

> ##残差线性 

> crPlots(pic)

> ##同方差性 >0.05,满足方差不变

> ncvTest(pic)

Non-constant Variance Score Test 

Variance formula: ~ fitted.values 

Chisquare = 1.413038, Df = 1, p = 0.23455

> spreadLevelPlot(pic)


Suggested power transformation:  3.43003 

> ##离群值

> outlierTest(pic)

No Studentized residuals with Bonferonni p < 0.05

Largest |rstudent|:

   rstudent unadjusted p-value Bonferonni p

14 2.741071           0.010545       0.3269

> ##强影响点

> avPlots(pic)

> ####将离散点、杠杆值、强影响点做到一个图中 纵坐标绝对值大于2为离群点;水平大于0.2或者0.3的是高杠杆值;

> #圆圈大小与影响成正比

> influencePlot(pic,main="Influence Plot",sub="Circle size is proportional to Cook`s distance")

       StudRes        Hat        CookD

1  -1.69284861 0.10495836 1.578707e-01

7   1.02479319 0.12721355 7.640411e-02

14  2.74107120 0.05599694 1.819728e-01

19  2.46795140 0.03819278 1.028721e-01

31  0.01449139 0.21178329 2.921952e-05

> ## 验证 可信度

> anova(pic)

Analysis of Variance Table


Response: B

          Df Sum Sq Mean Sq F value    Pr(>F)    

A          1 251.85 251.846  17.162 0.0002712 ***

Residuals 29 425.57  14.675                      

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第14张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第15张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第16张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第17张图片
回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析_第18张图片




#广义线性模型-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)


##线性回归包括几个方面:数据观察,初步拟合,交互作用,多重共线性,回归诊断,拟合中出现的离群点,杠杆值,强影响点,删除后,重新拟合,模型比较--

##之后可能要预测,因此需要数据交叉验证分成2部分,一部分拟合,一部分验证。

你可能感兴趣的:(回归分析-一般线性回归和广义线性回归+分类数据数据挖掘分析)