Scalaで単位根検定 unit root test (Phillips-Perron Tests in scala)
RのPP.testをscalaに翻訳
import scala.math._ import org.apache.commons.math3.stat.correlation.SpearmansCorrelation; import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression; import org.apache.commons.math3.linear import org.apache.commons.math3.analysis.interpolation.SplineInterpolator import org.apache.commons.math3.analysis.interpolation.LinearInterpolator object PP_test{ def PP_test_func(x:Array[Double]):Double={ var y=1.0; if( x.length <= 1){ println("x is not a vector");return -1.0;} var yt=x.slice(1,x.length) var yt1=x.slice(0,(x.length-1)) var n=yt.length var tt=(1 to n).map{a=> a-n/2.0}.toArray var reg=new OLSMultipleLinearRegression(); var y1=(yt) val x1=Array.ofDim[Double](n,2) (0 to (n-1)).foreach{a=> x1(a)(0)=tt(a); x1(a)(1)=yt1(a); } reg.newSampleData(y1,x1); var beta=(reg.estimateRegressionParameters()); var beta_v=reg.estimateRegressionParametersVariance(); var epsilon=reg.estimateRegressionStandardError(); var residuals=reg.estimateResiduals(); println("test"+beta(0)+" "+beta(1)+" "+beta(2)+" "+sqrt(epsilon*epsilon*beta_v(2)(2))); println("var"); println("epsilon"); residuals.foreach{println} //Need Try and catch var tmp_int=0; var tstat=(beta(2)-1)/sqrt(epsilon*epsilon*beta_v(2)(2)); var ssqru=residuals.map{a=> a*a}.sum/n; residuals.foreach{println} var l=(4.0*sqrt(sqrt(n/100.0))).toInt tmp_int=0; var gamma2=(1 to (l)).map{j=> var k=0.0; ((j+1) to (n)).foreach{t=> k=k+residuals(t-1)*residuals(t-j-1);};k/n; } ; println("gamma2 ", gamma2(0)); tmp_int=0; var ssqrtl=ssqru+2.0*gamma2.map{a=> tmp_int=tmp_int+1;(1-(tmp_int)/(1.0+l))*a}.sum; var n2=n*n; var trm1=n2*(n2-1.0)*(yt1.map{a=> a*a}.sum)/12.0; tmp_int=0; var trm2=n*pow(yt1.map{a=> tmp_int=tmp_int+1;a*tmp_int}.sum,2); tmp_int=0; var trm3=n*(n+1.0)*yt1.map{a=> tmp_int=tmp_int+1;a*tmp_int}.sum*yt1.sum; var trm4=(n*(n+1.0)*(2.0*n+1)*pow(yt1.sum,2))/6.0 var Dx=trm1-trm2+trm3-trm4; var STAT=sqrt(ssqru)/sqrt(ssqrtl)*tstat-pow(n,3)/(4.0*sqrt(3)*sqrt(Dx)*sqrt(ssqrtl))*(ssqrtl-ssqru); println(trm1," ",trm2," ",trm3," ",trm4," ",Dx," ",STAT," ",ssqrtl); var table=Array(Array(4.38, 4.15, 4.04, 3.99, 3.98, 3.96), Array(3.95, 3.8, 3.73, 3.69, 3.68, 3.66), Array(3.6, 3.5, 3.45, 3.43, 3.42, 3.41), Array(3.24, 3.18, 3.15, 3.13, 3.13, 3.12), Array(1.14, 1.19, 1.22, 1.23, 1.24, 1.25), Array(0.8, 0.87, 0.9, 0.92, 0.93, 0.94), Array(0.5, 0.58, 0.62, 0.64, 0.65, 0.66), Array(0.15, 0.24, 0.28, 0.31, 0.32, 0.33)) table=table.map{a=> a.map{-_}} //table.foreach{a=> a.foreach{println}} var tablen=table.length; var tableT=Array(25.0,50.0,100.0,250,500,100000) var tablep=Array(0.01,0.025,0.05,0.1,0.9,0.95,0.975,0.99) //var tableipl: Array[Double]=new Array[Double](n); var tableipl=Array.fill(n)(0.0); //tableipl.foreach{println} //var interpolator=new SplineInterpolator(); var interpolator=new LinearInterpolator(); var m=0; tableipl=table.map{a:Array[Double] => var func=interpolator.interpolate(tableT,a); if(n<25) m=25 else m=n; if(m>100000) m=100000 else m=m; func.value(m+0.0); } tableipl.foreach{println} var STAT2=0.0 if(STAT< tableipl.min) STAT2=tableipl.min else STAT2=STAT; if(STAT> tableipl.max) STAT2=tableipl.max else STAT2=STAT2; var PVAL=interpolator.interpolate(tableipl,tablep).value(STAT2); println("PVAL:",PVAL); PVAL; } def main(args: Array[String]){ val data1=Array(20,17,30,42.3,17,50); println(PP_test_func(data1)); } }
ファイルからデータを読み込む
import scala.math._ import org.apache.commons.math3.stat.correlation.SpearmansCorrelation; import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression; import org.apache.commons.math3.linear import org.apache.commons.math3.analysis.interpolation.SplineInterpolator import org.apache.commons.math3.analysis.interpolation.LinearInterpolator import scala.io.Source object PP_test2{ def PP_test_func(x:Array[Double]):Double={ var y=1.0; if( x.length <= 1){ println("x is not a vector");return -1.0;} var yt=x.slice(1,x.length) var yt1=x.slice(0,(x.length-1)) var n=yt.length var tt=(1 to n).map{a=> a-n/2.0}.toArray var reg=new OLSMultipleLinearRegression(); var y1=(yt) val x1=Array.ofDim[Double](n,2) (0 to (n-1)).foreach{a=> x1(a)(0)=tt(a); x1(a)(1)=yt1(a); } reg.newSampleData(y1,x1); var beta=(reg.estimateRegressionParameters()); var beta_v=reg.estimateRegressionParametersVariance(); var epsilon=reg.estimateRegressionStandardError(); var residuals=reg.estimateResiduals(); println("test"+beta(0)+" "+beta(1)+" "+beta(2)+" "+sqrt(epsilon*epsilon*beta_v(2)(2))); println("var"); println("epsilon"); residuals.foreach{println} //Need Try and catch var tmp_int=0; var tstat=(beta(2)-1)/sqrt(epsilon*epsilon*beta_v(2)(2)); var ssqru=residuals.map{a=> a*a}.sum/n; residuals.foreach{println} var l=(4.0*sqrt(sqrt(n/100.0))).toInt tmp_int=0; var gamma2=(1 to (l)).map{j=> var k=0.0; ((j+1) to (n)).foreach{t=> k=k+residuals(t-1)*residuals(t-j-1);};k/n; } ; println("gamma2 ", gamma2(0)); tmp_int=0; var ssqrtl=ssqru+2.0*gamma2.map{a=> tmp_int=tmp_int+1;(1-(tmp_int)/(1.0+l))*a}.sum; var n2=n*n; var trm1=n2*(n2-1.0)*(yt1.map{a=> a*a}.sum)/12.0; tmp_int=0; var trm2=n*pow(yt1.map{a=> tmp_int=tmp_int+1;a*tmp_int}.sum,2); tmp_int=0; var trm3=n*(n+1.0)*yt1.map{a=> tmp_int=tmp_int+1;a*tmp_int}.sum*yt1.sum; var trm4=(n*(n+1.0)*(2.0*n+1)*pow(yt1.sum,2))/6.0 var Dx=trm1-trm2+trm3-trm4; var STAT=sqrt(ssqru)/sqrt(ssqrtl)*tstat-pow(n,3)/(4.0*sqrt(3)*sqrt(Dx)*sqrt(ssqrtl))*(ssqrtl-ssqru); println(trm1," ",trm2," ",trm3," ",trm4," ",Dx," ",STAT," ",ssqrtl); var table=Array(Array(4.38, 4.15, 4.04, 3.99, 3.98, 3.96), Array(3.95, 3.8, 3.73, 3.69, 3.68, 3.66), Array(3.6, 3.5, 3.45, 3.43, 3.42, 3.41), Array(3.24, 3.18, 3.15, 3.13, 3.13, 3.12), Array(1.14, 1.19, 1.22, 1.23, 1.24, 1.25), Array(0.8, 0.87, 0.9, 0.92, 0.93, 0.94), Array(0.5, 0.58, 0.62, 0.64, 0.65, 0.66), Array(0.15, 0.24, 0.28, 0.31, 0.32, 0.33)) table=table.map{a=> a.map{-_}} //table.foreach{a=> a.foreach{println}} var tablen=table.length; var tableT=Array(25.0,50.0,100.0,250,500,100000) var tablep=Array(0.01,0.025,0.05,0.1,0.9,0.95,0.975,0.99) //var tableipl: Array[Double]=new Array[Double](n); var tableipl=Array.fill(n)(0.0); //tableipl.foreach{println} //var interpolator=new SplineInterpolator(); var interpolator=new LinearInterpolator(); var m=0; tableipl=table.map{a:Array[Double] => var func=interpolator.interpolate(tableT,a); if(n<25) m=25 else m=n; if(m>100000) m=100000 else m=m; func.value(m+0.0); } tableipl.foreach{println} var STAT2=0.0 if(STAT< tableipl.min) STAT2=tableipl.min else STAT2=STAT; if(STAT> tableipl.max) STAT2=tableipl.max else STAT2=STAT2; var PVAL=interpolator.interpolate(tableipl,tablep).value(STAT2); println("PVAL:",PVAL); PVAL; } def main(args: Array[String]){ var source1 =Source.fromFile("test.csv","utf-8") val lines1=source1.getLines var list1=List[Double]() lines1.foreach{a:String => list1=(a.split('\t')(4).toDouble)::list1;} var rev_list1=list1.reverse; println(PP_test_func(rev_list1.toArray)); } }
そのほか 移動法など
import scala.io.Source import org.apache.commons.math3.stat.correlation.SpearmansCorrelation import scala.math._ import org.apache.commons.math3.stat.correlation.SpearmansCorrelation; import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression; import org.apache.commons.math3.linear import org.apache.commons.math3.analysis.interpolation.SplineInterpolator import org.apache.commons.math3.analysis.interpolation.LinearInterpolator object cor_cehek2_scala{ def PP_test(x:Array[Double]):Double={ var y=1.0; if( x.length <= 1){ println("x is not a vector");return -1.0;} var yt=x.slice(1,x.length) var yt1=x.slice(0,(x.length-1)) var n=yt.length var tt=(1 to n).map{a=> a-n/2.0}.toArray var reg=new OLSMultipleLinearRegression(); var y1=(yt) val x1=Array.ofDim[Double](n,2) (0 to (n-1)).foreach{a=> x1(a)(0)=tt(a); x1(a)(1)=yt1(a); } reg.newSampleData(y1,x1); var beta=(reg.estimateRegressionParameters()); var beta_v=reg.estimateRegressionParametersVariance(); var epsilon=reg.estimateRegressionStandardError(); var residuals=reg.estimateResiduals(); //println("test"+beta(0)+" "+beta(1)+" "+beta(2)+" "+sqrt(epsilon*epsilon*beta_v(2)(2))); println("var"); //println("epsilon"); //residuals.foreach{println} //Need Try and catch var tmp_int=0; var tstat=(beta(2)-1)/sqrt(epsilon*epsilon*beta_v(2)(2)); var ssqru=residuals.map{a=> a*a}.sum/n; //residuals.foreach{println} var l=(4.0*sqrt(sqrt(n/100.0))).toInt tmp_int=0; var gamma2=(1 to (l)).map{j=> var k=0.0; ((j+1) to (n)).foreach{t=> k=k+residuals(t-1)*residuals(t-j-1);};k/n; } ; //println("gamma2 ", gamma2(0)); tmp_int=0; var ssqrtl=ssqru+2.0*gamma2.map{a=> tmp_int=tmp_int+1;(1-(tmp_int)/(1.0+l))*a}.sum; var n2=n*n; var trm1=n2*(n2-1.0)*(yt1.map{a=> a*a}.sum)/12.0; tmp_int=0; var trm2=n*pow(yt1.map{a=> tmp_int=tmp_int+1;a*tmp_int}.sum,2); tmp_int=0; var trm3=n*(n+1.0)*yt1.map{a=> tmp_int=tmp_int+1;a*tmp_int}.sum*yt1.sum; var trm4=(n*(n+1.0)*(2.0*n+1)*pow(yt1.sum,2))/6.0 var Dx=trm1-trm2+trm3-trm4; var STAT=sqrt(ssqru)/sqrt(ssqrtl)*tstat-pow(n,3)/(4.0*sqrt(3)*sqrt(Dx)*sqrt(ssqrtl))*(ssqrtl-ssqru); //println(trm1," ",trm2," ",trm3," ",trm4," ",Dx," ",STAT," ",ssqrtl); var table=Array(Array(4.38, 4.15, 4.04, 3.99, 3.98, 3.96), Array(3.95, 3.8, 3.73, 3.69, 3.68, 3.66), Array(3.6, 3.5, 3.45, 3.43, 3.42, 3.41), Array(3.24, 3.18, 3.15, 3.13, 3.13, 3.12), Array(1.14, 1.19, 1.22, 1.23, 1.24, 1.25), Array(0.8, 0.87, 0.9, 0.92, 0.93, 0.94), Array(0.5, 0.58, 0.62, 0.64, 0.65, 0.66), Array(0.15, 0.24, 0.28, 0.31, 0.32, 0.33)) table=table.map{a=> a.map{-_}} //table.foreach{a=> a.foreach{println}} var tablen=table.length; var tableT=Array(25.0,50.0,100.0,250,500,100000) var tablep=Array(0.01,0.025,0.05,0.1,0.9,0.95,0.975,0.99) //var tableipl: Array[Double]=new Array[Double](n); var tableipl=Array.fill(n)(0.0); //tableipl.foreach{println} //var interpolator=new SplineInterpolator(); var interpolator=new LinearInterpolator(); var m=0; tableipl=table.map{a:Array[Double] => var func=interpolator.interpolate(tableT,a); if(n<25) m=25 else m=n; if(m>100000) m=100000 else m=m; func.value(m+0.0); } //tableipl.foreach{println} var STAT2=0.0 if(STAT< tableipl.min) STAT2=tableipl.min else STAT2=STAT; if(STAT> tableipl.max) STAT2=tableipl.max else STAT2=STAT2; var PVAL=interpolator.interpolate(tableipl,tablep).value(STAT2); //println("PVAL:",PVAL); PVAL; } def box_mean(x:List[Double],n:Int=2):List[Double]={ var y=List[Double](); var k:Int=0; var nn=n-1; var sum=0.0; x.foreach{ a => k match{ case k if k%n==n-1 => sum=sum+a/n;y=sum::y;sum=0; case _ => sum=sum+a/n; } k=k+1; } y.reverse } def diff_boxmean(x:List[Double],n:Int=2):List[Double]={ var tmp=0.0; var y=List[Double](); box_mean(x,n).foreach{a => y=a-tmp::y; tmp=a; } y.reverse.tail } def diff_boxmean_cor(x1:List[Double],x2:List[Double],n:Int=2):Double={ var xx1=diff_boxmean(x1,n) var xx2=diff_boxmean(x2,n) val cor = new SpearmansCorrelation(); cor.correlation(xx1.toArray,xx2.toArray); } def diff_boxmean_cor_PPtest(x1:List[Double],x2:List[Double],n:Int=2):Array[Double]={ var xx1=diff_boxmean(x1,n) var xx2=diff_boxmean(x2,n) val cor = new SpearmansCorrelation(); var cor2=cor.correlation(xx1.toArray,xx2.toArray); var pp1=PP_test(xx1.toArray) var pp2=PP_test(xx2.toArray) Array(cor2,pp1,pp2) } def main(args: Array[String]){ var source1 =Source.fromFile("data1.txt","utf-8") var source2 =Source.fromFile("data2.txt","utf-8") var source3 =Source.fromFile("normalize2.txt","utf-8") var source4 =Source.fromFile("normalize1.txt","utf-8") val lines1=source1.getLines val lines2=source2.getLines val lines3=source3.getLines val lines4=source4.getLines var list1=List[Double](); var list2=List[Double](); var list3=List[Double](); var list4=List[Double](); lines1.foreach{a:String => list1=(a.split('\t')(4).toDouble)::list1;} lines2.foreach{a:String => list2=(a.split(' ')(1).toDouble)::list2;} lines3.foreach{a:String => list3=(a.toDouble)::list3;} lines4.foreach{a:String => list4=(a.toDouble)::list4;} var rev_list1=list1.reverse; list2=list2.tail.tail.tail; var rev_list2=list2.reverse; var rev_list3=list3.reverse; var rev_list4=list4.reverse; rev_list2=rev_list2.map{a => var c= a/rev_list3.head rev_list3=rev_list3.tail; c } rev_list1=rev_list1.map{a => var c= a/rev_list4.head rev_list4=rev_list4.tail; c } source1.close(); source2.close(); //exit(); var cor1=new Array[Double](150); var p1=new Array[Double](150); var p2=new Array[Double](150); var pp=new Array[Double](3); for(i <-1 to 150){ println(i+" "+diff_boxmean_cor_PPtest(rev_list1,rev_list2,i).mkString(" ")); pp=diff_boxmean_cor_PPtest(rev_list1,rev_list2,i) cor1(i-1)=pp(0) p1(i-1)=pp(1) p2(i-1)=pp(2) } var minmin= Array(p1.indexWhere(a=> a>=0.05) match {case -1 =>1000; case other =>other} ,p2.indexWhere(a=> a>=0.05)).min println(minmin); } }