等分线性回归-R语言

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")

线 性回归析是一种重要的预测方法,目前已经广泛的应用于各种领域,在统 计学中,线性回归模型(Linear Regression Model,LRM)是利用称为线性回归方程的 最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归析。 在国内的金融市场中,当我们在对市场未来发展情况进行预测时,若能将影响市 场预测对象的主要因素找到,并且能够取得其数量数据,就可以采用线性回归 析进行预测。它是一种可行的且实用价值很高的常用金融市场预测方法。一般而 言,回归析模型有多种类型。依据自变量个数不同,可为简单回归模型和多 元回归模型。在简单回归模型中,自变量只有一个,而在多元回归模型中,自变 量有两个以上。依据自变量和因变量之间的相关关系不同,又可线性回归模 型和非线性回归模型。 使用线性回归模型析属于一般常态布之数据,可获的理想的析与预测 结果,但是在现实的数据往往隐含了一些极端值之数据,而这些极端值之数据是 研究社会科学的研究者所关注的对象,倘若使用线性回归模型以其平均值的概念 来概括这些极端值,会使得研究结果失真。然而,目前解决极端值之数据之模型, 大多采用(Koenker,1978)的回归模型且有许多相关文献可参考,但是位数 的概念对于一般人而言较陌生,并且位数回归模型较线性回归模型复杂不易理 解。因此,本书作者潘文超(Pan, 2017)教授在国际 SSCI 期刊” EURASIA Journal of Mathematics Science and Technology Education”第 13 卷第 8 期发表篇名为” A Newer Equal Part Linear Regression Model: A Case Study of the Influence of Educational Input on Gross National Income”,另外提出一种新的回归方法,本书 称之为”等线性回归模型”(Equal Part Linear Regression Model, EPLRM),做法是将 数据以若干等方式进行线性回归建模,如此便可以独立观察每一等的模型趋 势,并且与一般线性回归做比较,目前已经有相关文献(Zhong, 2017;Deng, 2017)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值