0
点赞
收藏
分享

微信扫一扫

等分线性回归-R语言

骑在牛背上看书 2022-03-16 阅读 184

1.1介绍

将数据以若干等分方式进行现象回归建模,如此可独立观察每一等分模型的趋势,并且与一般线性回归模型做比较。

       假设y依赖于x的一个连续性因变量,建模后的标准线性回归模型表示为yi=b0+b1xi+ei

ei服从均值为0的正态分布。

1.2回归分析

回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。

1.3步骤

  1. 数据用excel整理成“.csv”文件,在计算机的“C:\”中新建目录,命名为“data”, 将整理的“.csv”复制到该目录中,并改名为“testdata.csv”
  2. 登录http://eplrm.byethost31.com​​​​​​

【注意,这里用的潘文超老师的做法噢!我仅仅是个搬运工,然后对代码进行了一些整理而已!】

1.4代码(这部分是不用改的,直接用就好了)

#使用前先运行前面粗体字行代码(从标注start开始到end结束

#=====================start====================

install.packages("SparseM")

install.packages("quantreg")

install.packages("boot")

install.packages("ggplot2")

install.packages("grid")

install.packages("Rmisc")

library(SparseM)

library(quantreg)

library(boot)

library(ggplot2)

library(grid)

library("Rmisc")

#定义一个函数equal_lm来处理回归分析并解析数据

#四个参数,第一个formulation是方程式,第二个datak是数据

#第三个是modelname模型名字,第四个C是置信度,K表示变量个数yx一起)

equal_lm<-function(formulation,datak,modelname,c,k){

  variable<-c("constant","x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")

  names<-rep(0,k)

  for (i in 1:k){

    names[i]<-variable[i]

  }

  LRM=lm(formulation,data=datak)

  output=summary(LRM) 

  confident=confint(LRM,level=c)               #置信度区间

  beta<-output$coefficients                        #参数估计

  R_saure<-output$r.squared                  #R方的值

 

  #将系数存储到变量中

  conf<-rep(0,length(names))

  std.error<-rep(0,length(names))

  t_value<-rep(0,length(names))

  sig<-rep(0,length(names))

  low_confident<-rep(0,length(names))

  up_confidient<-rep(0,length(names))

  r_squre<-c(modelname,rep("-",(length(names)-1)))

 

  for(i in 1:length(beta[,1])){

    conf[i]<-beta[i,1]

    std.error[i]<-beta[i,2]

    t_value[i]<-beta[i,3]

    sig[i]<-beta[i,4]

    low_confident[i]<-confident[i,1]

    up_confidient[i]<-confident[i,2]

    r_squre[2]<-R_saure

  }

  result<-data.frame(names,r_squre,conf,std.error,t_value,sig,low_confident,up_confidient)

  return(result)

}

#=====================end====================

#2.DF_model将数据等分划分,并计算最终的结果

#formulation 为回归模型方程alldata为所有数据c为置信度,k为模型变量个数

#alpha为分成了几等分

DF_model<-function(formulation,alldata,c,k,alpha){

  n=length(alldata[,1])                   #数据的样本个数

  m=round(n/alpha)                             #表示每一等分数据的个数

  #m0为原始模型(未进行等分处理时的模型拟合结果)

 

result<-equal_lm(formulation,alldata,"model0",c,k)

  for(i in 1:alpha){

    if(i<alpha){

      temp1=m*(i-1)+1

      temp2=m*i

    }

    if(i==alpha){

      temp1=m*(i-1)+1

      temp2=n

    }

   

#拿到每一次等分的数据

    datak=alldata[temp1:temp2,]

    modelname<-paste("model",i)

   

    result_temp<-equal_lm(formulation,datak,modelname,c,k)

    result<-rbind(result,result_temp)

  }

  return(result)

}

#3,定义一个函数PY_data将数据平移划分,并计算模型结果

#formulation 为回归模型方程,alldata为所有数据,c为置信度,k为模型变量个数

#alpha为移动数据样本的个数,比如一次为5个数据,移动一步,alpha=5

py_model<-function(formulation,alldata,c,k,alpha){

  n=length(alldata[,1])            #数据的样本个数,  alpha为每一份样本的数据个数

  move<-n-alpha+1               #表示样本为alpha,一共需要移动的步数

  #m0为最开始的所有数据的模型

  m0<-equal_lm(formulation,data,"model0",c,k)

  for (i in 1:move){

    temp1=i

    temp2=i+alpha-1

    datak=alldata[temp1:temp2,]

    modelname<-paste("model",i)

    mk<-equal_lm(formulation,datak,modelname,c,k)

    m0<-rbind(m0,mk)

  }

  return(m0)

}

#===============end================

#4,画图置信区间

plot_conf<-function(k,mn,variable){

  names<-rep(0,k)

  for (i in 1:k){

    names[i]<-variable[i]

  }

  n=length(mn[,1])

 

  delta<-round(n/k)

  up_beta_x=rep(0,delta)

  low_beta_x=rep(0,delta)

  estima_beta_x=rep(0,delta)

  step=seq(1,delta,1)

  p<-NULL

  for (i in 1:k){

    for(j in 1:delta){

      temp=(j-1)*k+i

      up_beta_x[j]=mn[temp,8]

      low_beta_x[j]=mn[temp,7]

      estima_beta_x[j]=mn[temp,3]

    }

    name=names[i]

    plotdata0<-data.frame(up_beta_x,low_beta_x,estima_beta_x,step)

    len<-length(plotdata0[,1])

    plotdata<-plotdata0[2:len,]

    layer1=ggplot(plotdata, aes(x = step, y=estima_beta_x)) +

    geom_ribbon(aes(ymin = low_beta_x, ymax=up_beta_x), alpha = 0.2) +

    geom_line(linetype = 1, size =1.5, colour = "black")+geom_point(size = 1.8, shape = 21,fill = "white")            # 折线图函数

# 带状图函数:ymin设置下界,ymax设置上界;

   

layer2=geom_hline(size=1.0,aes(yintercept=mn[i,3]),linetype=4,colour="red")

    layer3=geom_hline(size=0.7,aes(yintercept=mn[i,7]),linetype=2,colour="black")

    layer4=geom_hline(size=0.7,aes(yintercept=mn[i,8]),linetype=2,colour="black")

    plots=layer1+layer2+layer3+layer4+ xlab("step") + ylab(name)

    p[[i]]=plots

  }

  multiplot( plotlist=p ,cols=2)

}

#========end=========

#==样本的方差检验函数F_test==

#DF_model过程很像

#variable<-c("GDP","X1","X2")data为所有数据,alpha为几等分

F_test<-function(variable,data,alpha){

  k<-length(variable)

  data_compare<-rep("-",k)

  f_value<-rep(0,k)

  p_value<-rep(0,k)

  result<-data.frame(data_compare,variable,f_value,p_value)

  #alpha=3

  alldata=data

  n=length(alldata[,1])                   #数据的样本个数

  m=round(n/alpha)                      #表示每一等分数据的个数

  #m0为原始模型(未进行等分处理时的模型拟合结果)

  temp=alpha-1

  for(i in 1:temp){

    temp11=m*(i-1)+1

    temp12=m*i

    #拿到每一次等分的数据

    datak1=alldata[temp11:temp12,]

    temp2=i+1

    for(j in  temp2:alpha){

      if(i<alpha){

        temp21=m*(j-1)+1

        temp22=m*j

      }

      if(i==alpha){

        temp21=m*(j-1)+1

        temp22=n

      }

      datak2=alldata[temp21:temp22,]

      modelname<-paste("model",i,"and",j)

      data_compare[1]<-modelname

      for(line in 1:k){

        linedata1<-datak1[,line]

        linedata2<-datak2[,line]

        varout<-var.test(linedata1,linedata2)

       

        f_value[line]<-varout$statistic

        p_value[line]<-varout$p.value

      }

      result_temp<-data.frame(data_compare,variable,f_value,p_value)

      result<-rbind(result,result_temp)

    }

  }

  len_res<-length(result[,1])

  len_str<-k+1

  Result<-result[len_str:len_res,]

  return(Result)

}

#============平移模型系数F检验==========

#三个参数,第一个平移结果,alpah为几等分,varivable为变量

py_xishu_f_test<-function(mode_pingyi_result,alpha,variavle){

  data<-mode_pingyi_result

  k=length(variavle)                                     #变量的个数

  n=length(mode_pingyi_result[,1])             #数据的长度

  m<-round(n/k)-1                                      #一共有多少个模型

  data_compare<-rep("-",k)

  f_value<-rep(0,k)

  p_value<-rep(0,k)

  delta<-round(m/alpha)                            #每一等分的数量

  result<-data.frame(data_compare,variavle,f_value,p_value)

  temp1=alpha-1

  for(i in 1:temp1){

    temp2=i+1

    line11<-((i-1)*delta+1)*k+1

    line12<-(i*delta+1)*k

    for(j in temp2:alpha){

      line21<-((j-1)*delta+1)*k+1

      line22<-(j*delta+1)*k

      modename<-paste("model",i,"and",j)

      datak1=data[line11:line12,3]

      datak2=data[line21:line22,3]

      data_compare[2]=modename

      for(beta in 1:k){

        index<-seq(1,m,k)+beta-1

        varout<-var.test(datak1[index],datak2[index])

        f_value[beta]<-varout$statistic

        p_value[beta]<-varout$p.value

      }

      result_temp<-data.frame(data_compare,variavle,f_value,p_value)

      result<-rbind(result,result_temp)

    }

  }

  len_res<-length(result[,1])

  len_str<-k+1

  Result<-result[len_str:len_res,]

  return(Result)}

#=======end======

【注意:以上代码直接用!!!!】

1.5代码(这部分是要根据自己的数据进行修改的)

#从这里开始依序执行等分线性回归分析

#====從這裡開始依序執行等分線性回歸分析================

#==1.读取数据==

#设置工作目录括号内参数为存放数据的目录,并读取数据

setwd("C:/data")

data=read.csv("testdata.csv")

#====2.简单线性回归====

#对所有数据

#c=0.95表示置信度为0.95k=10表示一共10个变量(9个X变量+1个常数项)

data=read.csv("testdata.csv")

model0_result1<equal_lm(Y~X1+X2+X3+X4+X5+X6+X7+X8+X9,datak=data,modelname="model0",c=0.95,k=10)

model0_result1

#======3.等分回归======

#等分回归,分3等分

#c=0.90表示置信度,k=10表示(9个X变量+1个常数项)alpha=3表示3等分

data=read.csv("testdata.csv")

model_dengfen_result<-DF_model(Y~X1+X2+X3+X4+X5+X6+X7+X8+X9,alldata=data,c=0.90,k=10,alpha = 3)

model_dengfen_result

#保存结果到csv文件mode_pingyi_result为变量名称后面参数为存为文件名称

write.csv(model_dengfen_result,"dengfeng.csv")

variable<-c("Y","X1","X2","X3","X4","X5","X6","X7","X8","X9")

plot_conf(k=10, mn=model_dengfen_result,variable)

#=========4.平移模型======

# c=0.95表示置信度为0.95,k=10表示9个变量和1个常数项

data=read.csv("testdata.csv")

mode_pingyi_result<-py_model(Y~X1+X2+X3+X4+X5+X6+X7+X8+X9,data,c=0.90,k=10,alpha = nrow(data)/3)

mode_pingyi_result                          #保存结果到csv文件

write.csv(mode_pingyi_result,"pingyimodel.csv")

variable<-c("Y","X1","X2","X3","X4","X5","X6","X7","X8","X9")

plot_conf(k=10, mn=mode_pingyi_result,variable)

#========5.使用F检验测试样本数据=====

#两个参数,一个是data,一个是变量variable,一个是等分数量

data=read.csv("testdata.csv")

variable<-c("Y","X1","X2","X3","X4","X5","X6","X7","X8","X9")

F_test_result<-F_test(variable,data,3)

F_test_result

write.csv(F_test_result,"data_F_test.csv")

#===6.平移模型回归系数的f检验 ===

data=read.csv("testdata.csv")

mode_pingyi_result<-py_model(Y~X1+X2+X3+X4+X5+X6+X7+X8+X9,data,c=0.95,k=10, alpha= nrow(data)/3)

mode_pingyi_result

data_beta_result<-py_xishu_f_test(mode_pingyi_result,3,c("constant","x1","x2","X3","X4","X5","X6","X7","X8","X9"))

data_beta_result

write.csv(data_beta_result,"data_F_test.csv")

举报

相关推荐

0 条评论