量化经济

查看: 1288|回复: 0
打印 上一主题 下一主题

GEMPACK与GAMS语言的相互转换(第二章:建模程序语言)

[复制链接]

参加活动:0

组织活动:0

174

主题

247

帖子

1839

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1839
楼主
跳转到指定楼层
发表于 2019-12-19 09:18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本推文是对 "Introduction to GEMPACK for GAMS Users" by Michael Kohlhaas and Ken Pearson
https://www.copsmodels.com/ftp/gamsgp.pdf第二章的部分翻译和总结。它适用于对GEMPACK或GAMS已经有一定基础的研究员。GEMPACK和GAMS均使用类似于代数的编程语言。因此,一旦研究者能够区别两种软件的编程格式和思路,便容易在两个软件平台上对经济模型相互转化。本推文将分多期介绍这篇文章,感兴趣的读者可以从该网站(https://www.copsmodels.com/gpgams1.htm)提前下载原文全文和文章附带的GEMPACK和GAMS举例来对比模型。


以下表格对比了GAMPACK和GAMS的基本建模程序语言结构:
图片来源:"Introduction to GEMPACK for GAMS Users" by Michael Kohlhaas and Ken Pearson

以下各小节对上面的各行语言结构做出详细解释:


1. 评论符号和字母大小写

在GAMS和GEMPACK 的TAB文件中都允许注释。在GAMS文件中,注释通常位于以“*”开头的单独一行,表示注释。在GEMPACK 的TAB文件中,注释以感叹号“!”开头,以另一个感叹号“!”结尾,对变量的命名可以放在变量后面的两个“# ” 符号之间。

GAMS和GEMPACK均不区分大小写。建模人员通常使用大写或小写来使文件更可读。

2. Default Statements (默认语句设置)
在上一期文章第三节中,我们提到GEMPACK将非线性与线性化变量和方程区分开来,必须相应地定义各个变量。为了方便起见,GEMPACK允许省略定义语句。在这些情况下,需要预先定义默认设置。例如:
VARIABLE (DEFAULT = LEVELS) ;
指示,除非另有说明,否则所有变量都定义为非线性化的变量。

3. FILE 和READ (读取数据)
在GAMS中,数据值可以通过命令TABLEs、SCALARs或PARAMETERs 直接赋值。在GEMPACK中,数据通常存储在数据文件中,并通过READ语句从该文件中读取。FILE语句定义文件的逻辑名称,即数据文件在TABLO文件中的地址。运行模拟时,计算机上数据文件的实际名称将在命令文件中给出。这允许使用不同的起始数据文件(例如,表示不同年份或不同聚合的数据)来轻松解决同一模型。

4. SETs(集合)

在GAMS中,每当这个集合的成员被引用时,集合的名称将被用作索引。如果要用另一个名称引用集合,则必须通过ALIAS(别名)语句引入该名称。在GEMPACK中,索引的选择与集合的名称无关。当一个系数、变量或方程要被索引时,需要用此格式:
(ALL, index, SET)
即时定义索引的名称及其所覆盖的集合。

5. SCALARs,PARAMETERs,COEFFICIENTs

在GAMS中,用SCALARs 和PARAMETERs来定义参数。定义格式如下:
            Parameter
            ALFHAFAC(f,j);

在GEMPACK中,用COEFFICIENTs定义参数。定义格式如下:
COEFFICIENT
            (all, f, FAC) (all, j, SECT) ALFHAFAC(f,j)


在GAMS中,一个参数(如税率)的值可以在两个模拟之间改变,以模拟政策对经济的冲击。在GEMPACK中,外生变量命令通常用于此目的。

比如:
GAMS:
            Parameter TaxRate;
            TaxRate = 10;
            Solve …

            TaxRate = 20;
            Solve …

GEMPACK:
            在TAB文件里:
            Variable (Linear) TaxRate;

            在Command文件里
            Exogenous TaxRate;
            Shock TaxRate = 100; !表示100%增长,从10到20!

6. TABLEs(表格)

TABLEs是将数据输入GAMS程序的一种命令。在GMAPEACK中,不存在此命令。数据是从文件和程序(如MODHAR和ViewHAR)中读取的,这有助于创建和修改数据文件。GEMPACK中的数据文件可以是文本文件(可以使用文本编辑器创建,也可以从电子表格或其他程序导入)或二进制文件(头数组文件),可以使用MODHAR或ViewHAR创建。

7. VARIABLEs(变量)
在 GAMS 中,VARIABLE 定义内生变量。在GEMPACK中,变量在初始被定义的时候可以是内生变量或者外生变量。在命令文件(Command)中再被定义为内生或外生。这种灵活性使得GEMPACK改变模型的闭合时而不必改变TAB文件(因此不必重新运行程序TABLO)。

此外,在GEMPACK中,变量必须预先指定为线性(LINEAR)或者非线性(LEVEL),线性变量还需区分变化(CHANGE)或者百分比变化(PERCENT_CHANGE)。尽管变量再TAB文件中可以指定为非线性(LEVEL),所有模拟结果都是线性变量:可以是百分比变化(最常见)或绝对值变化。报告哪个结果取决于如何在TAB文件中定义变量。比如下面对一个价格变量的定义,如果如下(注意所有变化都是相对于模拟前数值的变化):
Variable (Percent_Change) (all, i , SECT) pcom(i)
则结果为百分比变化。如果如下:
Variable (Change) (all, i , SECT) pcom(i)
则结果为绝对值变化。
8.FORMULAs and EQUATIONs(公式和方程)

在CGE模型中,公式通常用于计算参数、变量初始值,或者模拟后更新变量。在GAMS中,公式可以直接用等式表达:
            *Intermediate input of commodity i in industry j
            XC_Z (i, j) = DVCOMIN (i, j) / PC_Z (i) ;
在GEMPACK中,需要用命令FORMULA先定义公式:
            Formula # Intermediate input of commodity i in industry j #
            (all, i, SECT) (all, j, SECT) XC_Z (i, j) = DVCOMIN (i, j) / PC_Z (i) ;

在GEMPACK中,还可以在命令FORMULA后追加定义。FORMULA(INITIAL)表示在多次模拟中仅在第一次模拟中计算。FORMULA(ALWAYS)表示在多次模拟中每一次再计算。

在CGE模型中,等式通常组成方程组,用于计算内生变量。

在GAMS例子中:
            EQUATIONS
            Com_clear(i);
            *Commodity market clearing
            Com_clear(i)..   XCOM(i) =E= XH(i) + SUM(j, XC(i,j));
先用命令EQUATIONS定义等式名字,再用“Com_clear(i)..”引出等式内容。等式两端用“=E=”连接。

在GEMPACK例子中,需要用命令EQUATION先定义等式即可:
            Equation Com_clear  # Commodity market clearing #
            (all, i, SECT) XCOM(i) = XH(i) + SUM(j, SECT, XC(i,j));

9. UPDATEs(更新)

这个GEMPACK的命令在GAMS文件中没有对应项。UPDATEs使GEMPACK能够从线性化方程中精确计算出原非线性方程的解。这个命令的意思是:当相关的价格和数量发生变化时,从数据库中读取的内容(通常是美元值)是如何变化的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册" title="注册帐号">立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系我们
邮箱:contactus@econmod.cn
电话: +86 18310935320
公司地址:北京中关村E世界C座五层

小黑屋|量化经济  

GMT+8, 2024-5-17 14:11 , Processed in 0.102543 second(s), 31 queries .

快速回复 返回顶部 返回列表