《zTree说明书.doc》由会员分享,可在线阅读,更多相关《zTree说明书.doc(104页珍藏版)》请在三一办公上搜索。
1、目录1 关于z-Tree.41.1 手册使用样式.52 入门.62.1 术语 .6 2.2 公共物品实验向导72.3 第一次测试处理.133 处理的详述.173.1 无交互简单实验.17 3.1.1数据结构和简单设计.17 3.1.2注释.20 3.1.3简单的行为.21 3.1.4步骤树.22 3.1.5数据显示和输入.23 3.1.6 Profit变量和TotalProfit变量.24 3.1.7例子:计算练习(guess_sin.ztt).253.2 交互实验:对称博弈.26 3.2.1Table functions26 3.2.2其他表中的Table functions.27 3.2.
2、3条件执行.27 3.2.4对不同受试者计算不同的值.29 3.2.5操作范围符.30 3.2.6一个组里面表格函数对成员的限制.30 3.2.7基本的组配对.31 3.2.8例子:等级依赖支付.333.3 非对称式,同时博弈.34 3.3.1条件执行.34 3.3.2对不同受试者计算不同的值.36 3.3.3参数表.36 3.3.4重要的参数.38 3.3.5组配对.39 3.3.6练习:一般2x2博弈(博弈222)39 3.3.7练习:程序中的组定义.413.4 屏幕布局42 3.4.1小的布局:项目42 3.4.2大的布局:屏幕设计与盒子44 3.4.3放置盒子443.4.4 基本盒类型
3、463.4.5 按钮位置493.4.6 背景布局50 3.4.7 文本中插入变量.503.4.8 RTF文本格式523.5 顺序博弈.52 3.5.1 顺序移动53 3.5.2 同时在不同的步骤54 3.5.3 步骤的结束55 3.5.4 例子:最后通牒博弈553.6 连续性拍卖市场.57 3.6.1 概念57 3.6.2 合同表中的一个双向拍卖59 3.6.3 准备拍卖的布局60 3.6.4 要价60 3.6.5 搜索信息61 3.6.6 作出声明62 3.6.7 接受报盘63 3.6.8 坚持受试者的输入64 3.6.9 拍卖步骤详述65 3.6.10 在程序中创建新的记录65 3.6.1
4、1 加入质量663.7 发布报价市场.663.8 时钟拍卖.67 3.8.1 荷兰式拍卖67 3.8.2 离开一个步骤683.9 先进理念.69 3.9.1 博弈依赖于先前的结果. 69 3.9.2 新表的定义. 693.9.3 有条件执行的语句 . 71 3.9.4 循环:while和repeat.72 3.9.5 复杂的移动结构. 73 3.9.6 不定长处理. 74 3.9.7 例子:战略方法(使用数组). 75 3.9.8 开启和关闭信息. 76 3.9.9 在会话表中从处理复制数据到处理.76 4 问卷77 4.1 概观.77 4.2 市场问卷.77 4.2.1 地址表.771 关于
5、z-Treez-Tree程序是由苏黎世大学开发的。它是为进行没有太多经验的经济学实验特别设计的。它包括两部分,一个是z-Tree“苏黎世现成的实验工具箱”,另一个是z-Leaf“受试者使用的程序”。在z-Tree中,人们可以定义和进行实验。人们可以用z-Tree设计广泛的实验,包括公共品博弈、结构化讨价还价、竞价市场或双重拍卖。z-Tree编程需要一定的经验。此后,进行实验所需的努力最小:一个有经验的实验者可以在不到一小时内设计一个公共品博弈,可以在不到一天内设计一个双重拍卖。性能:在苏黎世,z-Tree用于几乎所有计算机所进行实验。程序在26台拥有486er处理器和16 MB内存的电脑连接的
6、以太网总能有效配置。z-Tree手册包括两个部分:教程和参考手册。教程可按顺序阅读,它从第二章开始,学习z-Tree编程的基本元素。本章详细阐述了如何在一台计算机上进行环境测试。第三章学习设计实验。第四章调查问卷可省略。第五章是进行实验必不可少的,它解释了一个实验会议的正常程序以及处理如计算机崩溃的紧急情况。第六章介绍了z-Tree如何安装在一个实验室。z-Tree非常的灵活。然而,也可能发生你想实现的东西并没有涵盖在程序内的情况。在z-Tree的网站http:/www.iew.unizh.ch/ztree上你可以找到提示和技巧。如果你仍然觉得缺少了什么或者你发现了一个程序中的错误,请发送邮件
7、到ztreeiew.unizh.ch。我要感谢以下z-Tree用户对程序的耐心和他们对如何提高程序提出的建议:Vital Anderhub, Armin Falk, Ernst Fehr, Simon Gchter,Florian Knust, Oliver Kirchkamp, Andreas Laschke, Martin Strobel, Jean Robert Tyran。我还要感谢Alan Durell, Armin Falk, Christina Fong, Omar Solanki and Beatrice Zanella帮我介绍本手册中的程序。Omar Solanki将德语原文
8、翻译成英语。1.1 手册使用样式 例如:文本字体是Times RomanIn a non-computerized Experiment程序字体是CourierM=0;记录字段字体是Courier0.1文字变量字体为italics,例子中的“if”,“else”,圆括号必须如例子所示。“condition”必须用适当的文本代替。if( condition ) statementselse statements标签对话框字体ArialNumber of subjects菜单和菜单命令字体Arial BoldSave Client Order菜单名称可以用做分隔符先于菜单命令,也可用于分层菜单。F
9、ile Save As New Box Help Box阶段树元素字体Arial Small CapsACTIVE SCREEN主键使用 F5修改键在主键前使用-tab2 入门2.1 术语在一个非计算机化的实验中有一个或多个实验者(experimenter)和很多受试者(subject),后者通过实验者互相沟通。在计算机化的实验中这种沟通是通过计算机的。实验者操作的计算机称为实验者计算机(experimenter PC)。 受试者操作的计算机称为受试者计算机(subject PCs)。实验者使用的程序是“z-Tree”,它是服务器程序或服务器。受试者使用的程序是“z-Leaf”,它是客户端程序
10、或客户端。 图:Z-Tree 的客户端、服务器框架注意不要混淆服务器程序与文件服务器,后者是用来存储程序、数据和实验结果的。文件服务器对进行实验不是完全必要的。只要客户端和服务器建立连接,服务器和客户端之间就直接进行通信,而不用通过文件服务器。但是,文件服务器方便启动。所有文件服务器上存储的信息都是可读的。例如,这就能让客户端找到是哪台计算机启动的服务器。这就使用不同的计算机作为实验者计算机变得更容易。通过会话,即从受试者来到实验环境到接受支付报酬后离开这段时间内发生的事情。一套相应的会话就构成了一个实验。一个处理就是存储在文件中的一个会话的一部分。处理是怎样定义的将在第三章“处理定义”讲述。
11、 每个会话都包括一个或多个处理,随后还有一套问卷。问卷还可以自由定义,这讲在第四章讲述。在2.2和2.3,我们将有一个定义处理的指南,这些章节的目的是对怎样使用z-Tree程序有一个初步的印象。2.2 公共品实验向导在本章我们我们将看到一个简单公共品处理的编程。我们将在一个直觉的层次展示程序,在下一章进行详细描述。在这个公共品处理中,受试者分成4个人一组,他们决定将20分中多少贡献给公共品,这成为项目。受试者的利润有两部分组成:第一部分是他们所持有的20减去他们所贡献的。第二部分是从公共物品所得的收入。小组的所有贡献相加,乘以1.6并分配给小组中所有的受试者。图 : Z-Tree 开始于无标题
12、处理现在让我们编程这个处理。当我们启动z-Tree,一个无标题的空处理窗口会在你看见的图形上方打开。处理是由一个叫做步骤树的结构树呈现的:一个处理是由一系列步骤构成的。在开始构造步骤之前,我们要做一些准备。首先,我们要设置一些参数。在background,我们输入受试者的编号,组号,周期数和怎样将分数换算成货币。双击步骤树中的BACKGROUND或者通过选择栏中Treatment菜单选择Info打开这个对话。下面就是对话框。图: Background中的对话,可以输入一些基本参数 将subject设为24,因为我们想定义4个人一组的6个组。我们有10次重复因而将# paying periods
13、设为10。最后,我们将show up fee设置为10。这是受试者来的时候以本地货币单位 (SFR in Zurich)给他们的一笔钱。在苏黎世,一般说来我们支付的费用是10瑞士弗兰克斯。汇率定义是内部点(实验货币单位)在当地货币单位的价值。举例为100分换算成7SFR。处理的具体参数如捐款为20,效率因素1.6是在程序内定义的。插入一个程序,选中步骤树中BACKGROUND中ACTIVE SCREEN上面的元素。然后在Treatment菜单中选择New Program,下面就是对话框:图 2.1: 在程序对话中输入程序在Program区域输入下列语句: EfficiencyFactor =
14、1.6;Endowment = 20;在处理的开始,定义所有的参数是一个好的经验,例如在BACKGROUND。这使得处理更容易理解也可以在某个位置对参数进行修改。现在,我们添加第一个步骤。这个是贡献输入步骤,即受试者输入他们的贡献决定。选中BACKGROUND,选择Treatment菜单中的New Stage,一个对话打开。在这个对话框中我们可以做一些选择。在我们的处理中,我们不必改变默认选项。我们只需要将步骤的名称改为contribution entry然后点击OK。我们看到这个步骤(任何步骤)包涵两个元素(如下图):Active screen和Waitingscreen。Active sc
15、reen代表“重要的”画面。受试者在这个画面中获取信息和输入决定。Waitingscreen是在受试者结束这个步骤是出现的,直到受试者可以继续试验为止。图 2.2: 步骤树中一个步骤所包含的active screen 和waiting screen 现在我们定义contribution entry中的Active screen。一个画面有盒子组成:画面的矩形部分。在Treatment菜单中New box中有各种不同的盒子。最普通的盒子就是standard box。选中contribution entry中的Active screen,然后选择New boxNew standard box出现一
16、个对话框,所以的选项都正确的选择了,所以我们直接点击OK。我们在这个盒子里放置项目。一个项目代表了一个变量。首先我们说明捐款这个变量Endowment。选中Stantard box,然后在Treatment menu中选择New item 在Label中输入Your endowment,在Variable中输入Endowment,在Layout中输入1。后者是指Endowment这个变量的值将会乘以1(如20而不是20.0),这个值被标注成“Your endowment”。图 2.3: 项目对话框,项目代表变量,这个对话框显示的是项目的输出。第二个项目由contribution entry组成
17、。将这个变量叫做Contribution。这是个输入变量。这表示变量Contribution不会被展示,而是受试者输入一个值,这个值就被赋给这个变量。它的标签是Your contribution to the project。它必须乘以1(在Layout中输入)并在0和Endowment之间(在对话中Minimum 和Maximum中输入)。图 2.4: 这个项目展示了一个输入变量这个步骤将在按下一个按键后完成。这个按键在变量Contribution这个项目后插入。在Treatment菜单中选择New Button在出现的对话框中,我们可以输入展示给受试者的按键名。在输入已经完成的步骤中,默认
18、值”OK”是好的选择,对话框中其他的选项将在后面阐述,默认选项是好的选择。图 2.5: 按钮对话框第一个步骤完成。在我们的处理中,还有第二个步骤,利润显示步骤:选中contribution entry步骤,然后在Treatment菜单中选择New Stage在对话框中,将新步骤命名为profit display。在profit display步骤中,我们显示受试者的收入。在显示之前,我们必须先计算它。在这个步骤的开始我们先插入一段程序,它在受试者进入这个步骤是开始执行。插入程序先选中profit display步骤然后在Treatment菜单中选择New program在Program中,输入
19、:SumC = sum( same( Group ), Contribution);N = count( same( Group ) );Profit = Endowment - Contribution + EfficiencyFactor * SumC/N;第一行计算一个组中受试者贡献的总数。组是预先定义的变量。第一组为1,第二组为2,以此类推,这将在第三章2.1中详述。第二行计算一个组中受试者的数量。当然,在这个处理中我们可以写N=4;然而,上述公式让我们不用改变任何一行程序而运行不同组团人数的处理。最后一行我们计算受试者的报酬。预先定义的变量Profit就是为了这个计算。这个变量很特殊
20、因为在每轮的最后,这个变量就会相加。在会话的结尾,你可以很容易生成一个文件,即是所谓的包括每个受试者的在整个会话期间的利润总数的报酬文件。现在,我们定义profit display的画面:首先,我们在profit display步骤的Active screen中插入一个standard box。然后,我们在这个盒子中插入三个项目。我们要显示: 个人的贡献, 贡献的总和 和 一轮中受试者的收入。我们插入一个项目来显示受试者自己的贡献和前面说明的贡献总和。在显示受试者的收入的项目中,我们在Layout中输入1,因为我们想用一位精度来表示变量Profit。这个profit display显示屏上有一
21、个按钮,我们给这个按钮取名”continue”。因为受试者还没有确定任何事情。这个按钮可以让受试者能更快地继续运行而不是默认超时。 这样我们就完成测试了。下面的图片显示我们公共品测试的步骤树。现在保存这个测试结果。从 file菜单栏里选择 save as,出现存储的对话框。给这次测试命名,并把它存储在你喜欢的路径下。 图2.6 公共品实验的步骤树2.3 第一次测试处理这一部分,我们展示如何去测试一个处理,测试让我们找到处理中的错误。大多数错误在受试者减少时可以发现。所以一个好的策略去开始处理就是用少的受试者,因为这简单一点。特别是,你只需要用很少的受试者完成输入。一般来讲。只用一轮来测试是很高
22、效的。现在我们用两个受试者一轮来测试处理。测试一个处理,你有两种方法。你可以在实验室工作,为每个受试者开一台电脑正如程序设计的那样。比较简单的方式是你先从一个文件服务器的文件路径里打开一个z-Tree,然后在同一文件路径下打开z-Leaf。每台电脑上你打开z-Leaf的时候,z-Leaf的开始界面就会出现。如果你想在室外测试这个处理,你可以在一台电脑上运行多个z-Leaves.你只需要给每个z-Leaves不同的名字。你也可以通过创建zleaf快捷方式来实现(在explorer:Menu FileCreate Shortcut)。对每个快捷方式,打开属性对话框,单击快捷方式标签并附加文本”/n
23、ame Yourleafname”在目标域中(见 2.7)。在/name之前和之后必须有一个空格,在斜线(/)之后不能有空格。你的leafname可以是任何名称。不同的快捷方式必须有不同的名称。然后可以双击快捷方式启动z-Leaves。你可以使用-tab组合键切换不同的程序。 图 2.7:窗口中的快捷方式对话框。这个z-leaf叫做”first”不论你是否在运行z-Tree的计算机上运行z-Leaf,还是在实验室的另一台计算机上运行,你可以核对到底有多少z-Leaves即时运行连接在z-Tree的。接下来你要做的是:在z-Tree,在Run菜单中选择Clients table。当z-Leave
24、s连接着z-Tree,你可以看见计算机的名称出现在当前窗口的第一列。图 2.8:有两个客户端连接的Clients Table,一个客户端叫”first”,一个客户端叫”second”当足够多的客户端已经连接,你就可以开始这个处理。开始处理,处理的窗口必须在前面,然后在Run菜单中选择Start Treatment。当你已经开始这个处理,下面的画面将会出现在z-Leaf运行的计算机上:图 2.9:客户端屏幕上的公共品处理这是contribution entry步骤的active screen。它由两个盒子组成。最上面的header box显示的是轮数和剩余时间。因为这包含在Background的
25、Active screen中,在每个步骤的active screen中都会被显示。在standard box中我们看到步骤树中定义的项目和按钮。我们现在可以在”Your contribution to the project”文本旁边的区域中输入0到20之间的数值并单击”OK”按钮。如果你输入一个非法数值,如25,-7或2.2,信息会提示我们输入错误。在z-Tree中,你可以在”Clients Table”中观察到受试者所处的状态。每个步骤有两个状态:活动状态,用星形表示,与active screen一致。等待状态,用破折号表示,和waiting screen一致。这可以让你核对是否还有受试者
26、在进入。当受试者进入,你可以在所谓的subject Table中观察他们的决定。这个表格在Run菜单中打开。 图 2.10:Clients Table,”first”受试者已经进入,”second”还没有进入当所有的受试者进入,他们的利润就被计算并显示。测试一个处理意味着你要测试所有的数据是否都是按照你所打算的计算的,还有画面看起来是否优良。如果你找到一个错误,你必须修改它(或者至少尝试修改它)并重新测试处理。你应该怎样修改错误?修改程序最简单的方法就是双击程序的步骤树元素。然后你可以编辑它,即是修改它。你可以通过双击修改任何步骤树元素或者选中它然后选择菜单命令TreatmentInfo你也可
27、以选中一个步骤树元素将它移动到另一个地方。如果这个元素不能被移动到新的位置,程序会发出哔哔声。你可以选择步骤树元素然后选择EditCut来移除它。最后,你可以复制和粘贴一个元素:选中这个元素复制并选择Copy。然后,在你想要将元素复制的地方选择Paste。现在我们在向导的最后部分了。你可以用-F4组合键来退出z-Leaves,在用菜单命令Quit来停止z-Tree。下面的警告对话框会出现:”The session is not finished with the writing of a payment file. Do you nevertheless want to quit?”你不必对此
28、担心,这个提示只有当你在与真正的受试者进行会话是才有用,这讲会在3.9.5中阐述。下一章中,我们将详解怎样编写处理。3 处理的详述正如入门中讲述的,一个处理是存储在一个文件中的一次对话的一部分。在上一章,我们给出了一个构造一个简单处理过程的向导。本章中,我们将详细讲述怎样构造处理。在接下来的部分,我们将说明在z-Tree中越来越复杂的实验是怎样执行的。每一节会先包含一个理论指导接着是举例说明概念提出的例子。3.1 无交互简单实验 本章我们介绍z-Tree最基本的特征。首先我们说明数据是怎样存入z-Tree及程序是怎样修改数据的。然后,我们说明信息是怎样向受试者显示的以及受试者的输入是怎样进行的
29、。最后,我们给出一个概述说明一个处理中的活动进程是怎样组织的。3.1.1 数据结构和简单设计 一个会话相关的状态信息被存放在一个数据库中。这个数据库由很多表格组成。表格的行叫做记录,列叫做变量。每个变量都有一个名称来定义它。表格中的单独条目叫做单元格。在z-Tree中,单元格只能是数字,不能是文本。在图3.1,你可以看到两张表:globals table和subjects table,它们出现在一个空的处理中1。第一行表示变量的名称。在这个例子中globals table有一个记录(通常情况),subjects table有三个记录。 图3.1:z-Tree数据库中最重要的表globals t
30、able和subjects table。 1当一个处理正在运行时,你可以查看这些表。只需要在Run菜单中选择table。 变量的名称可以是任何字符。准确的讲,一个变量可以子母,数字和下划线”_”组成。变量的第一个字符必须是字母。附加符号,空格和标点符号是不允许的。区分大小写。因此,hallo,Hallo和hAllo是3个不同的变量。你可以给变量一个长的名称,这样程序会更容易理解。如果你想给变量一个几个字符的名称,你可以用下划线将字符分开或者你可以以大写字母开头。合法变量名称的例子: Acontribution23v_2_13Buyers_offerBuyersoffer不合法的变量名: 12a
31、 以数字开头v 2 13 有空格v.1.0 有小圆点BuyersOffer 有撇号有些变量是被预先定义好的。即,它们会出现在每个处理中。其他变量都是一个处理的特殊变量它们在程序中定义。程序放置在步骤的开始阶段或者进入Background在表格定义和Active screen之间。程序总是定义为一个特殊的表换句话说,它们总是在一个特殊的表中执行。这张表在程序对话中声明如图3.2所示。在这个对话框中,在弹出的下拉菜单中包含了处理所有的表。 图3.2:在program对话框中,程序必须在指定的表中才能运行 最简单的表是全局表,因为它只包含一个记录。因此,变量也决定单元格。所以,我们可以讨论一个全局变
32、量的值。在这个时候,想到了在这个表中的程序。在程序中最重要的元素是赋值语句。它进行计算并将这个计算结果分配给一个变量,分配的语法如下:Name_of_variable = expression; 方程右边的表达式计算和分配变量给方程的左边。注意每个赋值语句用分号结束。如果这个变量已经有一个值了,这个值会被重写,如果该变量不存在,那么它会被这个语句创建。一个表达式中允许所有基本类型的计算。像往常一样,乘法和除法计算在加法和减法之前。在所有情况下都是从左至右计算。因此,2+3*4等于14,而不是20。10-5-2等于3而不是7。此外还有一系列函数可以提供,如最小值函数、最大值函数、指数函数、随机函
33、数、round函数。(参考手册中包含了表达式可以含有的所有运算符和函数的完整列表。)表达式中的所有变量必须先创建好,也就是说,它们必须在程序之前或者在步骤树之前就被定义。在一个处理的开始定义变量是一个好的习惯。你还可以使用注释来解释每个变量的目的(见3.1.2)。这使得程序更容易被其它实验者理解。赋值语句的例子: p=20;Q=q1+q2;Profit = Endowment - Contribution + EfficiencyFactor * SumC/N;Cost = exp( Effort / k ); 我们已经看到在全局表中只包含一个记录。其它表可能包含更多的记录。如果在这样一个表中
34、执行一个程序,总有一个为执行该方案的记录。这个记录被称为当前记录。这使得我们可以省略为记录数字的指数。例如,考虑预先定义的受试者表。这个表每个受试者就是一个记录。受试者表中的程序是为每个受试者单独执行的,也就是说单独为每个记录。所以,每当一个程序运行时,表和记录是固定的,因此在一个程序中,单元格时由变量决定的。让我们用一个例子来明确说明。假设一个处理定义为三个受试者,变量g的值为5,12,7。现在来分析下列程序: M=20;X = M-g;程序执行受试者表的每一行。首先,执行第一行:定义变量M和X,并得到表的第一行的值: 现在,程序执行第二行。因此,得到表中第二行M和X的值:最后,当程序为第三
35、行执行时,得到第三行M和X的值:在这个例子中,空白表示未定义的值:我们不应该使用它们。当一个程序为表中的每一个记录执行完之后(这是一般的情况),将不会有未被定义的单元格。注意到计算必须以记录来进行而不是以语句来进行。所以,当计算第二个受试者的X时并不是所有的受试者都知道M的值。3.1.2 注释为了在你处理一个课题很久之后能够容易地明白这个程序,你可以插入注释。所有在/*和 */之间或者在/之后的都是注释,对程序的实际运行没有影响。当程序运行时,这些文字会被忽略掉。我们将在我们的例子中使用注释去解释为什么每个申明都有特殊的格式。例子: a=1; / 初始化b = sum( /*cos(x*x+)
36、 */ a);/ 第二行表达式有错误/ 所以我们把问卷调查表注释掉来/ 定位错误注意:用/*和*/注释可能不能起作用。在/*之后第一个*/中断了注释。所以下面的程序非法: /* 把下面这一行放入注释不要a /* first variable */ =1;b = 2;*/ 你也可以利用注释定位错误。为了找到错误的语句,你可以把有疑问的片段放入注释,知直到没有错误信息出现。在你修改错误之后,你可以把这些注释移调。3.1.3 简单的行为一个处理包含很多轮。当你运行这个处理时,这个数目被固定了。在每一轮,有许多步骤需要完成。每个过程有两个屏幕展示给那个步骤的受试者。首先,显示Active screen
37、。在这个屏幕上,受试者可以做输入或者浏览信息。当一个步骤的Active screen显示时,我们就说受试者处于这个步骤的活跃状态。数据录入后或者时间超时,受试者进入这个过程的等待状态,然后这个过程的屏幕即waiting screen出现。从等待状态,受试者可以进入下一个过程。正常来讲,当所有受试者到达等待状态时,就进入到下一个过程。在每个过程的开始,数据被计算。这些数据在程序中定义。步骤树中的BACKGROUND元素包含不属于某一特定步骤的信息。在BACKGROUND对话框中,比如你设置步骤数和受试者数目。然后BACKGROUND包含了用于处理的表的列表,在这些表之后,BACKGROUND可能
38、还有程序。他们在每轮的开始被执行。在Active screen中含的BACKGROUND元素,在每个步骤被插入。(在3.4节也可以看到)。一般当前一轮和余下时间在每个步骤中显示。把他们插入到BACKGROUND的Active screen上就可,而不用在每个步骤插入。BACKGROUND中被包含在waiting screen的元素,被插入每个步骤的waiting screen。通常waiting screen只包含一个信息如“请等待至实验继续”。在这时,这个信息可以在BACKGROUND定义,而每个过程的waiting screen就可以不定义。下面的图显示了一个两个步骤例子中BACKGROUND中的元素和步骤中元素的关系。 图 3.3:每个步骤从0个或多个程序开始。然后active screen和waiting screen显示给受试者。Backgr