[This article was first published on Statistics et al., and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
< !--[if gte mso 9]>< xml> < o:OfficeDocumentSettings> < o:AllowPNG/> < ![endif]-->< !--[if gte mso 9]>< xml> < w:WordDocument> < w:View>Normal < w:Zoom>0 < w:TrackMoves/> < w:TrackFormatting/> < w:PunctuationKerning/> < w:ValidateAgainstSchemas/> < w:SaveIfXMLInvalid>false < w:IgnoreMixedContent>false < w:AlwaysShowPlaceholderText>false < w:DoNotPromoteQF/> < w:LidThemeOther>EN-CA < w:LidThemeAsian>X-NONE < w:LidThemeComplexScript>X-NONE < w:Compatibility> < w:BreakWrappedTables/> < w:SnapToGridInCell/> < w:WrapTextWithPunct/> < w:UseAsianBreakRules/> < w:DontGrowAutofit/> < w:SplitPgBreakAndParaMark/> < w:EnableOpenTypeKerning/> < w:DontFlipMirrorIndents/> < w:OverrideTableStyleHps/> < m:mathPr> < m:mathFont m:val="Cambria Math"/> < m:brkBin m:val="before"/> < m:brkBinSub m:val="--"/> < m:smallFrac m:val="off"/> < m:dispDef/> < m:lMargin m:val="0"/> < m:rMargin m:val="0"/> < m:defJc m:val="centerGroup"/> < m:wrapIndent m:val="1440"/> < m:intLim m:val="subSup"/> < m:naryLim m:val="undOvr"/> < ![endif]-->< !--[if gte mso 9]>< xml> < w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false" DefSemiHidden="false" DefQFormat="false" DefPriority="99" LatentStyleCount="376"> < w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/> < w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/> < w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 2"/> < w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 3"/> < w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 4"/> < w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 5"/> < w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 6"/> < w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 7"/> < w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 8"/> < w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 9"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 4"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 5"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 6"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 7"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 8"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 9"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 1"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 2"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 3"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 4"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 5"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 6"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 7"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 8"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 9"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Indent"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote text"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation text"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="header"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footer"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index heading"/> < w:LsdException Locked="false" Priority="35" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="caption"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of figures"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope address"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope return"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote reference"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation reference"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="line number"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="page number"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote reference"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote text"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of authorities"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="macro"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="toa heading"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 4"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 5"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 4"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 5"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 4"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 5"/> < w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Closing"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Signature"/> < w:LsdException Locked="false" Priority="1" SemiHidden="true" UnhideWhenUsed="true" Name="Default Paragraph Font"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 4"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 5"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Message Header"/> < w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Salutation"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Date"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Note Heading"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Block Text"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hyperlink"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="FollowedHyperlink"/> < w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/> < w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Document Map"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Plain Text"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="E-mail Signature"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Top of Form"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Bottom of Form"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal (Web)"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Acronym"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Address"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Cite"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Code"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Definition"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Keyboard"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Preformatted"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Sample"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Typewriter"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Variable"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Table"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation subject"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="No List"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 4"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 4"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 5"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 4"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 5"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 6"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 7"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 8"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 4"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 5"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 6"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 7"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 8"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Contemporary"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Elegant"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Professional"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 1"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 2"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 3"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Balloon Text"/> < w:LsdException Locked="false" Priority="39" Name="Table Grid"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Theme"/> < w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/> < w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/> < w:LsdException Locked="false" Priority="60" Name="Light Shading"/> < w:LsdException Locked="false" Priority="61" Name="Light List"/> < w:LsdException Locked="false" Priority="62" Name="Light Grid"/> < w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/> < w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/> < w:LsdException Locked="false" Priority="65" Name="Medium List 1"/> < w:LsdException Locked="false" Priority="66" Name="Medium List 2"/> < w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/> < w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/> < w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/> < w:LsdException Locked="false" Priority="70" Name="Dark List"/> < w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/> < w:LsdException Locked="false" Priority="72" Name="Colorful List"/> < w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/> < w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/> < w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/> < w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/> < w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/> < w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/> < w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/> < w:LsdException Locked="false" SemiHidden="true" Name="Revision"/> < w:LsdException Locked="false" Priority="34" QFormat="true" Name="List Paragraph"/> < w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/> < w:LsdException Locked="false" Priority="30" QFormat="true" Name="Intense Quote"/> < w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/> < w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/> < w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/> < w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/> < w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/> < w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/> < w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/> < w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/> < w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/> < w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/> < w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/> < w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/> < w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/> < w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/> < w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/> < w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/> < w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/> < w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/> < w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/> < w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/> < w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/> < w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/> < w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/> < w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/> < w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/> < w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/> < w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/> < w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/> < w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/> < w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/> < w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/> < w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/> < w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/> < w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/> < w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/> < w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/> < w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/> < w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/> < w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/> < w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/> < w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/> < w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/> < w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/> < w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/> < w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/> < w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/> < w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/> < w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/> < w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/> < w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/> < w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/> < w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/> < w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/> < w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/> < w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/> < w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/> < w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/> < w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/> < w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/> < w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/> < w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/> < w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/> < w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/> < w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/> < w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/> < w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/> < w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/> < w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/> < w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/> < w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/> < w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/> < w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/> < w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/> < w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/> < w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/> < w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/> < w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/> < w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/> < w:LsdException Locked="false" Priority="19" QFormat="true" Name="Subtle Emphasis"/> < w:LsdException Locked="false" Priority="21" QFormat="true" Name="Intense Emphasis"/> < w:LsdException Locked="false" Priority="31" QFormat="true" Name="Subtle Reference"/> < w:LsdException Locked="false" Priority="32" QFormat="true" Name="Intense Reference"/> < w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/> < w:LsdException Locked="false" Priority="37" SemiHidden="true" UnhideWhenUsed="true" Name="Bibliography"/> < w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/> < w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/> < w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/> < w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/> < w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/> < w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/> < w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/> < w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/> < w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/> < w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/> < w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/> < w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/> < w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/> < w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/> < w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 1"/> < w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/> < w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/> < w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/> < w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/> < w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 1"/> < w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 1"/> < w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 2"/> < w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/> < w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/> < w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/> < w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/> < w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 2"/> < w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 2"/> < w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 3"/> < w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/> < w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/> < w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/> < w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/> < w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 3"/> < w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 3"/> < w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 4"/> < w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/> < w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/> < w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/> < w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/> < w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 4"/> < w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 4"/> < w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 5"/> < w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/> < w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/> < w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/> < w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/> < w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 5"/> < w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 5"/> < w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 6"/> < w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/> < w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/> < w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/> < w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/> < w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 6"/> < w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 6"/> < w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/> < w:LsdException Locked="false" Priority="47" Name="List Table 2"/> < w:LsdException Locked="false" Priority="48" Name="List Table 3"/> < w:LsdException Locked="false" Priority="49" Name="List Table 4"/> < w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/> < w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/> < w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/> < w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 1"/> < w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/> < w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/> < w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/> < w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/> < w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 1"/> < w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 1"/> < w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 2"/> < w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/> < w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/> < w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/> < w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/> < w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 2"/> < w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 2"/> < w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 3"/> < w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/> < w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/> < w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/> < w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/> < w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 3"/> < w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 3"/> < w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 4"/> < w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/> < w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/> < w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/> < w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/> < w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 4"/> < w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 4"/> < w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 5"/> < w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/> < w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/> < w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/> < w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/> < w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 5"/> < w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 5"/> < w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 6"/> < w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/> < w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/> < w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/> < w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/> < w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 6"/> < w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 6"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Mention"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Hyperlink"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hashtag"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Unresolved Mention"/> < w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Link"/> < ![endif]-->< !--[if gte mso 10]>< ![endif]--> Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
In this post, I showcase a bare-bones point-and-click implementation of the classic board Reversi (also called Othello*) in the R programming language. R is typically used for more serious, statistical endeavors, but it works reasonably well for more playful projects. Building a classic game like this is an excellent high-school level introduction to programming, as well as a good basis for building and testing game AI.
If you want to skip ahead and just play Reversi in R right away, download this .R file:
open it either base R or Rstudio, set the working directory to the location where you downloaded to, and run the file with source(“Reversi Functions.r”) . This will print some basic play instructions for you.
The starting configuration shown here is just one of many possible configurations that the code can handle. This program can allow for many variants in play including board dimensions, ‘walls’ that block capture, and three or more players. These will be shown in a later post.
When running, the active player can click on any of the legal spaces, marked with red circles, to place a stone and capture any enemy pieces that are sandwiched between the newly placed piece and already-placed pieces.
The board after the first couple moves by “B”lack and “W”hite are shown in the next two figures.
The game continues until neither player has a legal move, which usually, but not always, occurs when the board is filled or when there is only one player’s pieces remaining.
Before we look at the user-defined functions for this game, let’s review a few important functions in base R.
paste(x, collapse=””) # Takes a vector of string variables and converts it into a single string with nothing between each of the original strings.
strsplit(x,””)[[1]] # Takes a single string and converts it into a vector of string variables of one character each.
plot.new(); plot.window(xlim=.. ylim=) # Clears the existing plot, if any, and creates a new one with the given x and y limits.
locator(1) # Takes the first mouse click on a plot and extracts the x and y coordinates on the plot.
The pasteand strsplit functions are useful for passing information about the stones to each other in a convenient way. String manipulation is slow, so it’s not the most computationally efficient way to handle this, but it’s also not the biggest task. If I had to run thousands of games quickly, say, for machine learning purposes, I would have used a more sophisticated method here.
The locator function is what makes it possible to play this game with a mouse instead of a keyboard, which makes the whole thing much more enjoyable to play and test.
The game instead is broken down into as many user-defined functions as is convenient. In other words, the programming is modular, it’s broken down into many small modules. Modularity makes it easier to modify the program and prevents errors that may occur from having to change the same code in multiple locations. Furthermore, with good function names, the whole process is easier to read by a human.
We start with setup.board, which establishes the board dimensions, starting pieces, number of players, and any walls or gaps. For this demo, let’s stick with the classic Othello setup.
setup.board = function(style = “Basic Othello”)
{
if(style == “Basic Othello”)
{
board = matrix(“.”,nrow=8,ncol=8)
board[4,4] = “W”
board[5,5] = “W”
board[4,5] = “B”
board[5,4] = “B”
}
}
A piece can be placed anywhere that a ‘sandwich’ can be made. To determine this, we first need a function to ‘look’ in a given direction from a given position on a board. For example, looking from b1 in the southeast direction on this board…
…should produce a ‘look’ of ”B,W,W,space,space,space”. The look.to function takes in a board, position, and direction, and returns the state of the board spaces from that location outwards until it hits the edge of the board. The direction dictates the values of xstep and ystep, which in turn dictate which spaces are the board are examined. the order The look.around function calls look.to from a given position for all eight directions, one at a time.
look.to = function(board, position, direction)
{
…
if(direction == “N”){ xstep = 0; ystep = -1}
if(direction == “NE”){ xstep = 1; ystep = -1}
…
if(direction == “W”){ xstep = -1; ystep = 0}
if(direction == “NW”){ xstep = -1; ystep = -1}
## Do this until we look to the edge of the board
while(this_x > 0 & this_x <= ncol(board) &
this_y > 0 & this_y <= nrow(board))
{
### Record the stone (or space) and xy coords at the observed location
stones = c(stones, board[this_y,this_x])
xlist = c(xlist, this_x)
ylist = c(ylist, this_y)
### Iterate the observed location based on the selected direction
this_x = this_x + xstep
this_y = this_y + ystep
}
…
}
The legal.look function takes a given sequence of stones from the look.to function, and determines if a given player (a single character of a string) can make a sandwich in that direction. It returns the number of sandwiched enemy stones. Note that the code considers any character other a blank space ( . ) or a wall ( # ) to be an enemy stone, allowing this code to work with 3+ players.
The legal.directions function calls legal.look for each direction and returns the list of directions in which a capture can be made by the given player by placing at the given position. The which.legal function calls legal.direction for each empty position on the board to determine which, if any, spaces a given player may place on the board.
legal.look = function(player, look)
{
…
Nenemies = 0
enemy_chain = TRUE
while( Nenemies < length(look) & enemy_chain)
{
### Examine a space, if it’s anything except
### the current player’s piece, a space, or a wall, it’s an enemy piece
examined_piece = look[Nenemies + 1]
if(examined_piece %in% c(player,”.”,” “,”#”))
{ ## If it’s not an enemy, stop looking
enemy_chain = FALSE
}
else
{ ## If it is an enemy, iterate and keep looking
Nenemies = Nenemies + 1
}
}
### If there are enemy pieces all the way to the end of the board
### Return ‘no capture’.
if(Nenemies == length(look)){return(0)}
## There must be an allied piece at immediately after the enemy pieces
## If so, return the number of pieces that can be captured
examined_piece = look[Nenemies + 1]
if(examined_piece == player)
{
return(Nenemies)
}
### Otherwise return ‘no capture’
return(0)
}
The plot.game function takes a board state, active player, and possibly the matrix of legal moves, and draws this information as a plot.
plot.game = function(board,player,legal_board=NULL,showlegal=TRUE)
The play.move function checks if a move at the position is legal by a given player on the given board. If it is, it updates the board by placing a stone for player at position and makes all the appropriate captures. It returns the new board state. It uses look.to and legal.look to determine which stones on the board to change.
play.move = function(board, this_player, position)
The play game is the main function that that runs the whole game.
play.game = function(board=NA)
It takes in mouse clicks with locator and converts them into positions on the board (note the inversion of the y-axis).
mouseclick = locator(1)
input_x = round(mouseclick$x)
input_y = round(mouseclick$y)
input_y = nrow(board) – input_y + 1
Before using that click, it first checks if that it maps to a space on the board, and that the space is a legal move by the given player. (If there is no legal move, it will accept any click as a ‘pass’, and move to the next player)
while(all(board == new_board) & any(legal_board == TRUE))
if(input_x > 0 & input_x <= Nx & input_y > 0 & input_y <= Ny)
legal_board = which.legal(board, current_player)
if(legal_board[input_y,input_x])
If the move is legal, it calls play.move to update the board and cycles to the next player.
new_board = play.move(board,this_player=current_player,position=c(input_y,input_x))
current_player = player_list[ 1 + (player_idx %% Nplayers)]
It continues to do this until no player has a legal move, or there are no spaces left on the board. After which it returns the board state as a matrix as well as the score of each player.
while( any(board == “.”) & players_skipped < length(player_list))
print(table(board))
return(board)
Finally, you can use setup.board to create a non-standard board and use it in play.game. For example, a 4×10 board can be created and used with the “Othello Wide” style.
board = setup.board(“Othello Wide”)
play.game(board)
* There are slight differences between the commercial version Othello, and the public domain game Reversi. Also, the name Othello is trademarked by Mattel.
To leave a comment for the author, please follow the link and comment on their blog: Statistics et al..
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.