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