EViews估计的方程可以显示带入系数以后的样子,比如
Estimated Equations:
=====================
CC=C(1)+C(2)*PP + C(3)*PP(-1) + C(4)*(WP+WG)
II=C(5)+ C(6)*PP + C(7)*PP(-1) + C(8)*KK
WP= C(9) +C (10) *XX + C(11)*XX(-1) +C(12)*AA
Substituted Coefficients:
=====================
CC=16.5547557654+0.0173022117998*PP + 0.216234040485*PP(-1) + 0.810182697599*(WP+WG)
II=20.2782089394+ 0.150221823899*PP + 0.61594357734*PP(-1) - 0.157787636546*KK
WP= 1.50029688603 +C (10) *XX + 0.146673821502*XX(-1) +0.130395687204*AA
下面三行就是带入系数以后的方程,问题是:EViews能不能不显示那么多位小数?
因为他们在用的时候常常有几十个甚至上百个方程,总不能每次都手工处理吧
反正我在EViews里没有找到选项,但是可以肯定的是 R一定能完成这项工作
于是昨天花了一上午写了个程序可以截取方程里的小数位数,晚上又改了一下,可以做四舍五入
##-----------------------------------------------
# 处理Eviews输出的方程系数小数位数
# 可以做四舍五入 有交互界面
# by ypchen@RUC
##-----------------------------------------------
format.eq <- function(){
require(tcltk)
tt<-tktoplevel()
digits <- tclVar("4") # 默认保留4位小数
entry.digits <-tkentry(tt,width="4",textvariable=digits)
tkgrid(tklabel(tt,text="要保留几位小数?"),entry.digits)
OnOK <- function(){
digitsVal <- as.numeric(tclvalue(digits))
process(digitsVal)
}
OK.but <-tkbutton(tt,text="处理文件",command= OnOK)
quit.but <- tkbutton(tt, text = "退出", command = function() tkdestroy(tt))
tkgrid(OK.but,quit.but)
tkgrid.configure(OK.but,sticky="w")
tkgrid.configure(quit.but,sticky="e")
# 以上三行做按钮的布局
tkfocus(tt)
process <- function(digits){
# digits是要保留的小数位数
tkmessageBox(message="选择要处理的文件")
file <- tclvalue(tkgetOpenFile(filetypes="{{文本文件} {.txt}}"))
if(!nchar(file)) {
tkmessageBox(message="没有选择文件,请重新运行程序")
return(NULL)
}
text <- readLines(file)
eq <- text[which(text!="")]
eqnum <- length(eq)
for(i in 1:eqnum){
eqi <- eq[i]
split.eqi <- unlist(strsplit(eqi,"\\."))
nsplit <- length(split.eqi)
for(j in 1:nsplit){
eqij <- split.eqi[j]
nc <- nchar(eqij)
nfind = nc+1
k=1
num.char <- as.character(0:9)
char <- substring(eqij,1:nc,1:nc)
kchar <- char[1]
while((any(kchar==num.char)|kchar==" ")&(k<nc)){
k <- k + 1
kchar <- char[k]
if(any(kchar==c("+","-","*","/",")","(","]","["))) {
nfind <- k
break
}
}
if(digits > nfind-1) digits = nfind-1
leftStr <- substring(eqij,1,digits)
if( any(char[digits+1]==num.char) ) {
as.num <- as.numeric(paste(".",substring(eqij,1,digits+1),collapse="",sep=""))
as.num <- round(as.num,digits)
as.char <- as.character(as.num)
leftStr <- substring(as.char,3)
} ## 做四舍五入
rightStr <- substring(eqij,nfind,nc)
if(nfind != (nc + 1)) {
eqij <- paste(leftStr,rightStr,sep="")
}
eqij -> split.eqi[j]
}
eqi <- paste(split.eqi,collapse=".")
eqi -> eq[i]
}
eq -> text[which(text!="")]
tkmessageBox(message="处理完毕\n请选择保存文件")
outfile <- tclvalue(tkgetSaveFile(initialfile="output.txt",
filetypes="{{文本文件} {.txt}}"))
write(text,outfile)
tkmessageBox(message="文件保存完毕")
}
}
format.eq()
# 处理Eviews输出的方程系数小数位数
# 可以做四舍五入 有交互界面
# by ypchen@RUC
##-----------------------------------------------
format.eq <- function(){
require(tcltk)
tt<-tktoplevel()
digits <- tclVar("4") # 默认保留4位小数
entry.digits <-tkentry(tt,width="4",textvariable=digits)
tkgrid(tklabel(tt,text="要保留几位小数?"),entry.digits)
OnOK <- function(){
digitsVal <- as.numeric(tclvalue(digits))
process(digitsVal)
}
OK.but <-tkbutton(tt,text="处理文件",command= OnOK)
quit.but <- tkbutton(tt, text = "退出", command = function() tkdestroy(tt))
tkgrid(OK.but,quit.but)
tkgrid.configure(OK.but,sticky="w")
tkgrid.configure(quit.but,sticky="e")
# 以上三行做按钮的布局
tkfocus(tt)
process <- function(digits){
# digits是要保留的小数位数
tkmessageBox(message="选择要处理的文件")
file <- tclvalue(tkgetOpenFile(filetypes="{{文本文件} {.txt}}"))
if(!nchar(file)) {
tkmessageBox(message="没有选择文件,请重新运行程序")
return(NULL)
}
text <- readLines(file)
eq <- text[which(text!="")]
eqnum <- length(eq)
for(i in 1:eqnum){
eqi <- eq[i]
split.eqi <- unlist(strsplit(eqi,"\\."))
nsplit <- length(split.eqi)
for(j in 1:nsplit){
eqij <- split.eqi[j]
nc <- nchar(eqij)
nfind = nc+1
k=1
num.char <- as.character(0:9)
char <- substring(eqij,1:nc,1:nc)
kchar <- char[1]
while((any(kchar==num.char)|kchar==" ")&(k<nc)){
k <- k + 1
kchar <- char[k]
if(any(kchar==c("+","-","*","/",")","(","]","["))) {
nfind <- k
break
}
}
if(digits > nfind-1) digits = nfind-1
leftStr <- substring(eqij,1,digits)
if( any(char[digits+1]==num.char) ) {
as.num <- as.numeric(paste(".",substring(eqij,1,digits+1),collapse="",sep=""))
as.num <- round(as.num,digits)
as.char <- as.character(as.num)
leftStr <- substring(as.char,3)
} ## 做四舍五入
rightStr <- substring(eqij,nfind,nc)
if(nfind != (nc + 1)) {
eqij <- paste(leftStr,rightStr,sep="")
}
eqij -> split.eqi[j]
}
eqi <- paste(split.eqi,collapse=".")
eqi -> eq[i]
}
eq -> text[which(text!="")]
tkmessageBox(message="处理完毕\n请选择保存文件")
outfile <- tclvalue(tkgetSaveFile(initialfile="output.txt",
filetypes="{{文本文件} {.txt}}"))
write(text,outfile)
tkmessageBox(message="文件保存完毕")
}
}
format.eq()
我在这里用了Tcl/tk 做了简单的交互界面
修改R安装目录下的 etc/Rprofile.site 可以给R的菜单里加一个新的项,如下图
大家看看有没有需要改进的地方
程序和示例文件下载:
下载附件:EviewsEquation.zip