Up

‚QŽˆ‹­§‘I‘ð‰Û‘èiM†ŒŸo—˜_FSDTj

•]’è–@ƒf[ƒ^‚̃xƒCƒY•ªÍiCmdStanPy‘Ήžj

 

@‚QŽˆ‹­§‘I‘ði2 alternative-forced-choice: 2AFCj‰Û‘è‚Ìê‡AƒmƒCƒYŽhŒƒ‚ƃVƒOƒiƒ‹ŽhŒƒ‚ªŠeŽŽs‚É‚¨‚¢‚Ä’ñަ‚³‚ê‚邪A‹óŠÔ“IˆÊ’u‚ð•Ï‚¦‚Äi‰E‚ƶA‚ ‚é‚¢‚Íã‚Æ‰º‚È‚Çj“¯Žž‚É’ñަ‚³‚ê‚éê‡A‚ ‚é‚¢‚Í’ñަ‚ÌŽžŠÔ‡˜‚ð•Ï‚¦‚Äi‘æ‚PƒCƒ“ƒ^ƒoƒ‹‚Æ‘æ‚QƒCƒ“ƒ^ƒoƒ‹j’ñަ‚³‚ê‚éꇂª‚ ‚éB“Œvƒ‚ƒfƒ‹‚ðl‚¦‚邯‚«‚ÍA‹óŠÔ‡˜‚ ‚é‚¢‚ÍŽžŠÔ‡˜‚É‚¨‚¯‚é‚Q‚‚̎hŒƒ’ñަ–@‚ð‚Æ‚à‚ɃA„‚ ‚é‚¢‚̓A„‚Å•\‚·‚±‚Æ‚ª‚Å‚«‚éBƒA„‚ÍAŽhŒƒ‚ª‹óŠÔˆÊ’u‚Å’ñަ‚³‚ê‚Ä‚¢‚邯‚«‚ÍA—Ⴆ‚ÎA¶‘¤‚ɃmƒCƒYŽhŒƒA‰E‘¤‚ɃVƒOƒiƒ‹ŽhŒƒ‚ª’ñަ‚³‚ê‚邱‚Æ‚ð•\‚µAŽžŠÔ‡˜‚̂Ƃ«‚Í‘æ‚PƒCƒ“ƒ^ƒoƒ‹‚ŃmƒCƒYŽhŒƒ‚ª’ñަ‚³‚êA‘æ‚QƒCƒ“ƒ^ƒoƒ‹‚ŃVƒOƒiƒ‹ŽhŒƒ‚ª’ñަ‚³‚ê‚邱‚Æ‚ð•\‚·BƒA„‚̂Ƃ«‚ÍA‡˜‚ª‹t‚ɂȂéBˆÈŒã‚Ìà–¾‚Å‚ÍA—Ⴆ‚΃A„‚ÍA‚Í‘æ‚PˆÊ’uA‚Í‘æ‚QˆÊ’u‚É’ñަ‚³‚ê‚éðŒ‚ð•\‚·‚Æ‚¢‚¤‚±‚Ƃɂ·‚éBŽhŒƒ’ñަðŒ•ʂɔ»’fi”½‰žj‚𕪗ނ·‚邯•\1‚̂悤‚ɂȂéB

 

•\1@2AFC‰Û‘è‚É‚¨‚¯‚éŽhŒƒ’ñŽ¦ðŒ‚Æ”½‰ži”»’fjB

 

ƒVƒOƒiƒ‹ŽhŒƒ‚Ì’ñަˆÊ’u‚Æ‚µ‚Ä”»’f‚³‚ꂽˆÊ’u

 

‘æ‚PˆÊ’u

‘æ‚QˆÊ’u

ƒA

Œë”½‰ž

³”½‰ž

ƒA

³”½‰ž

Œë”½‰ž

 

@‚¢‚ÜA1AFC‰Û‘è‚̃‚ƒfƒ‹‚Æ“¯‚¶‚­AƒmƒCƒYŽhŒƒ‚ÌŠ´Šo‚ª•½‹Ï‚OA•ªŽU‚P‚̳‹K•ª•z‚É]‚¢AƒVƒOƒiƒ‹ŽhŒƒ‚ÌŠ´Šo‚ª•½‹ÏA•ªŽU‚̳‹K•ª•z‚É]‚¤‚à‚̂Ƃ·‚éB‚·‚Ȃ킿A

 

A@

 

‚Å‚ ‚éB

@’ñަðŒƒA„‚¨‚æ‚уA„‚É‚¨‚¢‚ÄPíŒë·‚¨‚æ‚шʒu‘I‘ðƒoƒCƒAƒX‚ðl‚¦‚éBPíŒë·‚ÍAŽžŠÔŒë·‚ ‚é‚¢‚Í‹óŠÔŒë·‚ð•\‚·BˆÊ’u‘I‘ðƒoƒCƒAƒX‚ÍAŠ´Šo‚̈Ⴂ‚ٕ̕ʂƂ͕ʂɑæ‚PˆÊ’u‚ ‚é‚¢‚Í‘æ‚QˆÊ’u‚Ì‘I‘ð‚ðD‚ÞŒXŒü‚ð•\‚·B‚±‚ê‚ç‚̃oƒCƒAƒX‚ð‚܂Ƃ߂Ä

‚Æ‚¨‚«A‘æ‚QˆÊ’u‚ðŠî€‚É‚µ‚½‘æ‚PˆÊ’u‚ւ̃oƒCƒAƒXŒø‰Ê‚Æ‚µ‚Ä•\‚·‚ÆAŠ´Šo‚¨‚æ‚т̕ª•z‚͈ȉº‚̂悤‚ɂȂéB

ŽhŒƒ’ñަ‚ªƒA„‚̂Ƃ«A

 

A@

 

‚Å—^‚¦‚ç‚êA

 

 

‚ƂȂéB

ŽhŒƒ’ñަ‚ªƒA„‚̂Ƃ«A

 

A@

 

‚Å—^‚¦‚ç‚êA

 

 

‚ƂȂéB

 

•\‚P‚ÌŽÀŒ±‰Û‘è‚ÌꇂÍA‚ð‹‚߂邱‚Æ‚ª‚Å‚«‚È‚¢Buv‚̉¼’èi“™•ªŽUƒ‚ƒfƒ‹j‚Ì‚à‚Æ‚ÅA•ªÍ‚ªs‚í‚ê‚éB•\‚P‚̃fƒUƒCƒ“‚̉º‚Å•]’è–@‚ð—p‚¢‚邱‚Æ‚ª‚Å‚«‚éi‰ª–{A2025jBuv‚̉¼’è‚ð’u‚©‚È‚¢i•s“™•ªŽUƒ‚ƒfƒ‹‚ƌĂ΂ê‚Ä‚¢‚邪A“™•ªŽU‚ð‰¼’è‚µ‚È‚¢ƒ‚ƒfƒ‹‚Æ‚¢‚¤‚±‚Ƃł ‚èAƒf[ƒ^‚ª“™•ªŽU‚Å‚ ‚Á‚Ä‚à‚æ‚¢B“™•ªŽU‚Å‚ ‚é‚©‚Ç‚¤‚©‚í‚©‚ç‚È‚¢‚Æ‚«‚ÍA•s“™•ªŽUƒ‚ƒfƒ‹‚ð—p‚¢‚ê‚΂悢j‚Æ‚«‚ÍA•\‚P‚̃fƒUƒCƒ“‚ðŠg’£‚·‚ê‚΂悢BˆÈ‰º‚ÉA‹¤’ÊŽ–€‚ɂ‚¢‚Äà–¾‚µ‚½ŒãA“™•ªŽUƒ‚ƒfƒ‹‚Å•]’è‚ð—p‚¢‚È‚¢ê‡A“™•ªŽUƒ‚ƒfƒ‹‚Ŋ‚̕]’èƒJƒeƒSƒŠ‚ð—p‚¢‚éê‡A“™•ªŽUƒ‚ƒfƒ‹‚Å‹ô”ŒÂ‚Ì•]’èƒJƒeƒSƒŠ‚ð—p‚¢‚éê‡A•s“™•ªŽUƒ‚ƒfƒ‹‚Ìꇂ̃xƒCƒY•ªÍ‚ɂ‚¢‚Äà–¾‚·‚éB‚È‚¨ACmdStanPy‚Ì€”õ‚ÌŠÈ’P‚Èà–¾‚ðA‚±‚̃EƒFƒuƒTƒCƒg‚Ås‚Á‚½Bƒtƒ@ƒCƒ‹‚ÍA2AFCfiles.zip‚ɂ܂Ƃ߂½B

 

•]’è–@‚É‚¨‚¯‚é”»’fƒJƒeƒSƒŠ‚Ì‹«ŠE’liŠî€’lj‚ð‚Æ‚¨‚­B‚·‚Ȃ킿AƒVƒOƒiƒ‹ŽhŒƒ‚ÌŠ´Šo‚ƃmƒCƒYŽhŒƒ‚ÌŠ´Šo‚Ì·‚ª‚Ƃ̊Ԃɂ ‚邯‚«ƒJƒeƒSƒŠ‚Ì”»’f‚É‚È‚é‚Æl‚¦‚éB

‚̂Ƃ«

ŠÏŽ@ŽÒ‚Ì”»’fƒJƒeƒSƒŠ

‚Å‚ ‚éB

@”»’fƒJƒeƒSƒŠ‚Ì‘”‚ª‚SƒJƒeƒSƒŠ‚̂Ƃ«A—Ⴆ‚Δ»’fƒJƒeƒSƒŠ‚ÍŽŸ‚̂悤‚ɂȂéB‚±‚±‚ÅA‚Ì’l‚ÍAƒVƒOƒiƒ‹ŽhŒƒ‚ÌŠ´Šo‚ª‹­‚¢‚قǃJƒeƒSƒŠ‚Ì’l‚͑傫‚¢’l‚ɂȂ邪AƒA„‚ƃA„‚ł̓VƒOƒiƒ‹ŽhŒƒ‚Ì’ñަˆÊ’u‚ªˆÙ‚Ȃ邱‚ƂɒˆÓB

ƒA„‚̂Ƃ«A

ƒJƒeƒSƒŠ‚PF@ƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éB

ƒJƒeƒSƒŠ‚QF@ƒVƒOƒiƒ‹‚Í‘½•ª‘æ‚PˆÊ’u‚Å‚ ‚éB

ƒJƒeƒSƒŠ‚RF@ƒVƒOƒiƒ‹‚Í‘½•ª‘æ‚QˆÊ’u‚Å‚ ‚éB

ƒJƒeƒSƒŠ‚SF@ƒVƒOƒiƒ‹‚Í‘æ‚QˆÊ’u‚Å‚ ‚éB

ƒA„‚̂Ƃ«A

ƒJƒeƒSƒŠ‚PF@ƒVƒOƒiƒ‹‚Í‘æ‚QˆÊ’u‚Å‚ ‚éB

ƒJƒeƒSƒŠ‚QF@ƒVƒOƒiƒ‹‚Í‘½•ª‘æ‚QˆÊ’u‚Å‚ ‚éB

ƒJƒeƒSƒŠ‚RF@ƒVƒOƒiƒ‹‚Í‘½•ª‘æ‚PˆÊ’u‚Å‚ ‚éB

ƒJƒeƒSƒŠ‚SF@ƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éB

 

‚¢‚ÜA”»’fƒJƒeƒSƒŠ‚Ì‘”‚ð‚Æ‚¨‚¢‚½‚Æ‚«AƒJƒeƒSƒŠ‹«ŠE‚ð

 

 

‚Æ‚¨‚­B—ÝÏ•W€³‹K•ª•zŠÖ”‚ɑ΂µ‚Ä

 

A@

 

‚Æ‚¨‚¢‚½‚Æ‚«A”»’fƒJƒeƒSƒŠ‚ªƒJƒeƒSƒŠ‚Å‚ ‚éŠm—¦‚ÍŽŸ‚̂悤‚É—^‚¦‚ç‚ê‚éB

ƒA„‚̂Ƃ«AƒJƒeƒSƒŠ‚Å‚ ‚éŠm—¦‚ÍAŽ®i‚Pj‚æ‚è

 

 

‚ƂȂéB

ƒA„‚̂Ƃ«AƒJƒeƒSƒŠ‚Å‚ ‚éŠm—¦‚ÍAŽ®i‚Qj‚æ‚è

 

 

‚ƂȂéB

 

•\2@ŽhŒƒ’ñަðŒ‚ɑ΂·‚éƒJƒeƒSƒŠ•]’è”»’f‚Ì•p“xB

 

ƒJƒeƒSƒŠ‚P

EEE

ƒJƒeƒSƒŠk

EEE

ƒJƒeƒSƒŠK

ƒA

EEE

EEE

ƒA

EEE

EEE

 

@ŠeŽhŒƒ’ñަðŒ‚ɑ΂·‚éƒJƒeƒSƒŠ”»’f‚Ì•p“x‚ª•\2‚̂悤‚Å‚ ‚邯‚«A–Þ“xŠÖ”‚ÍŽŸŽ®‚Å—^‚¦‚ç‚ê‚éB

 

@

ƒ‚ƒfƒ‹‚̃pƒ‰ƒ[ƒ^‚Ì”‚Í

 

 

‚Å‚ ‚邪AŽ®i‚Rj‚¨‚æ‚ÑŽ®i‚Sj‚ÌŠÖ”‚̈ø”‚Ì•ª”Œ`‚©‚çˆÈ‰º‚̂悤‚ȃpƒ‰ƒ[ƒ^’l‚Ì•s’è«‚ª”F‚ß‚ç‚ê‚éB

•ª”‚Ì•ª•êŽq‚É“¯‚¶”‚ðŠ|‚¯‚Ä‚à’l‚͕ςí‚ç‚È‚¢‚Ì‚ÅA•ª•ê‚Ì’l‚ð‚Æ‚¨‚¢‚Ä‚àˆê”Ê«‚ÍŽ¸‚í‚ê‚È‚¢B‚±‚ê‚ÍA“™•ªŽUƒ‚ƒfƒ‹ij‚ ‚é‚¢‚Í‚æ‚èˆê”Ê“I‚ɂ͊´Šo‚Ì’PˆÊ‚ð‚Å‚ ‚邿‚¤‚ÉÝ’è‚·‚邯‚¢‚¤‚±‚Ƃł ‚éB

 

•W€‚Ì‚QAFC‰Û‘è‚ɂ‚¢‚Ä‹c˜_‚𑱂¯‚éB

‚±‚ÌꇂÍA“™•ªŽUƒ‚ƒfƒ‹‚Ål‚¦‚邪AŠ´Šo‚ٕ̕ʗ͂Í

 

 

‚Æ•\‹L‚³‚ê‚éB

“™•ªŽU‚ð‰¼’è‚µ‚È‚¢ê‡‚ÍA•ٕʗ͂͂ŕ\‚³‚ê‚éB

 

 

‚Å‚ ‚éi‰ª–{A2025jB

 

 

‚Ü‚½A•ªŽq‚É‚¨‚¯‚邯‚É“¯‚¶’蔂ð‰Á‚¦‚Ä‚à

 

 

‚Å‚ ‚é‚Ì‚ÅAƒpƒ‰ƒ[ƒ^’l‚ðŒˆ‚ß‚é‚½‚߂ɂͧ–ñðŒ‚ª•K—v‚Å‚ ‚éBŠ´Šo‚Ì·‚Ì”»’f‚ªŒ´“_‚ÉŠÖ‚µ‚Ä‘Î̂ł ‚邯‚·‚邯A‚±‚ê‚̓JƒeƒSƒŠ‹«ŠE‚ÉŽŸ‚̉¼’è‚ð‚¨‚­‚±‚Ƃł ‚éB

 

@ƒJƒeƒSƒŠ”‚ª‹ô”i@Ž©‘R”j‚̂Ƃ«

 

 

‚±‚̂Ƃ«Aƒ‚ƒfƒ‹‚̃pƒ‰ƒ[ƒ^‚ÌŽ©—R“x‚Í

 

 

‚ƂȂéB

 

@ƒJƒeƒSƒŠ”‚ªŠï”i@Ž©‘R”j‚̂Ƃ«

 

 

‚±‚̂Ƃ«Aƒ‚ƒfƒ‹‚̃pƒ‰ƒ[ƒ^‚ÌŽ©—R“x‚Í

 

 

‚ƂȂéB

@•\2‚̃f[ƒ^‚ÌŽ©—R“x‚ÍA•\2‚̃f[ƒ^‚ðŽhŒƒ’ñަðŒ‚É‚¨‚¯‚é•p“x‚̔䗦ƒf[ƒ^‚Æl‚¦‚ê‚Î

 

 

‚ƂȂéBƒpƒ‰ƒ[ƒ^‚Ì„’肪•s’è‚Æ‚È‚ç‚È‚¢‚½‚߂ɂÍAƒpƒ‰ƒ[ƒ^‚ÌŽ©—R“x‚̓f[ƒ^‚ÌŽ©—R“xˆÈ‰º‚łȂ¯‚ê‚΂Ȃç‚È‚¢B‚·‚Ȃ킿A

 

 

‚Å‚ ‚邪A‚±‚ÌðŒ‚Í–ž‚½‚³‚ê‚Ä‚¢‚éB

 

“™•ªŽU‚ð‰¼’è‚µ‚È‚¢ê‡‚ɂ‚¢‚Ä‚ÍA•s“™•ªŽUƒ‚ƒfƒ‹‚Ì߂Ř_‚¶‚éB

 

 

 

 

“™•ªŽUƒ‚ƒfƒ‹i•]’è‚ð—p‚¢‚È‚¢ê‡j

 

•\‚P‚̃f[ƒ^‚̃xƒCƒY•ªÍ‚ÌStanƒXƒNƒŠƒvƒg‚ðƒŠƒXƒgA1‚̂悤‚É—pˆÓ‚µ‚½BƒŠƒXƒgA1‚̃XƒNƒŠƒvƒg‚ð—p‚¢‚ăxƒCƒY•ªÍ‚·‚éPythonƒXƒNƒŠƒvƒg‚ðƒŠƒXƒgA2‚̂悤‚É—pˆÓ‚µ‚½BƒŠƒXƒgA1‚̃tƒ@ƒCƒ‹iSDT2AFC2Cat.stanjAƒŠƒXƒgA2‚̃tƒ@ƒCƒ‹iSDT2AFC2Cat.pyjA‚¨‚æ‚Ñ“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚𓯂¶ƒtƒHƒ‹ƒ_‚É’u‚­B‚»‚̃tƒHƒ‹ƒ_‚ɃJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠiƒtƒHƒ‹ƒ_j‚ðˆÚ“®‚µ‚ÄACmdStanPy‚̃Cƒ“ƒXƒg[ƒ‹‚³‚ꂽŠÂ‹«‚É‚¨‚¢‚ÄAŽŸ‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚éB

 

(stan) *****/sdt_simple$ python SDT2AFC2Cat.py

 

ŽÀs‚·‚邯A“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚Æo—̓tƒ@ƒCƒ‹–¼‚Ìݒ肪‹‚ß‚ç‚ê‚éB

 

(stan) *****/sdt_simple$ python SDT2AFC2Cat.py

“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼(*.csv) = Data2Cat.csv

o—̓eƒLƒXƒgƒtƒ@ƒCƒ‹–¼(*.txt) = Results.txt

 

o—̓f[ƒ^ƒtƒ@ƒCƒ‹‚Í”CˆÓ‚̃eƒLƒXƒgƒtƒ@ƒCƒ‹–¼iƒtƒ@ƒCƒ‹Šg’£Žq.txtj‚Å‚ ‚邪A“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚ÍCSVŒ`Ž®‚̃tƒ@ƒCƒ‹‚Æ‚µ‚Ä}A‚P‚Ì—lŽ®‚Å—pˆÓ‚·‚éB

 

}A‚P@ƒf[ƒ^ƒtƒ@ƒCƒ‹Data2Cat.csv

 

‘æ‚Ps–ڂ͕ϔ–¼‚Ì–¼‘O‚ðÝ’è‚·‚邪AƒvƒƒOƒ‰ƒ€‚ł͗p‚¢‚È‚¢‚̂ŔCˆÓ‚Ì•¶Žš—ñ‚ł悢B‚½‚¾‚µA‘æ‚Ps–Ú‘æ‚P—ñ–Ú‚É•¶Žš—ñID‚ðÝ’è‚·‚邯AExcel‚Ìê‡A“ǂݞ‚ÝŽž‚ɃGƒ‰[ƒƒbƒZ[ƒW‚ª•\ަ‚³‚ê‚邱‚Æ‚ª‚ ‚邪A‚±‚ê‚Í–³Ž‹‚·‚éB‘æ‚Qs–Ú‚ÉŽhŒƒ’ñަðŒƒNAS>i—Ⴆ‚ÎA¶‚ɃmƒCƒYŽhŒƒA‰E‚ɃVƒOƒiƒ‹ŽhŒƒj‚É‚¨‚¯‚éƒf[ƒ^‚ðÝ’è‚·‚éB‘æ‚Q—ñ–Ú‚ÉuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚R—ñ–Ú‚ÉuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”‚ðÝ’è‚·‚éB‘æ‚Rs–Ú‚ÉŽhŒƒ’ñަðŒƒSAN„i—Ⴆ‚ÎA¶‚ɃVƒOƒiƒ‹ŽhŒƒA‰E‚ɃmƒCƒYŽhŒƒj‚É‚¨‚¯‚éƒf[ƒ^‚ðÝ’è‚·‚éB‘æ‚Q—ñ–Ú‚ÉuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚R—ñ–Ú‚ÉuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”‚ðÝ’è‚·‚éB‘æ‚Qs–ÚA‘æ‚Rs–Ú‚Æ‚àA‘æ‚Q—ñ–Ú‚ÍuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚PˆÊ’u‚Å‚ ‚éi—Ⴆ‚ÎAƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚R—ñ–Ú‚ÍuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éi—Ⴆ‚ÎAƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”‚Å‚ ‚éBƒf[ƒ^‚Ìݒ肪I‚í‚ê‚ÎAƒtƒ@ƒCƒ‹Šg’£Žq‚Æ‚µ‚Äu.csvv‚ð‘I‚ñ‚ŕۑ¶‚·‚邯ACSVŒ`Ž®‚̃tƒ@ƒCƒ‹‚Æ‚µ‚ĕۑ¶‚³‚ê‚éB

 

“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚Æo—̓eƒLƒXƒgƒtƒ@ƒCƒ‹–¼‚ðÝ’è‚·‚邯Aƒtƒ@ƒCƒ‹‚ª“ǂݞ‚Ü‚êAStan‚̃Rƒ“ƒpƒCƒ‹‚ªŽn‚Ü‚éBƒRƒ“ƒpƒCƒ‹‚ɂ͑½­‚ÌŽžŠÔ‚ªŠ|‚©‚éBƒRƒ“ƒpƒCƒ‹‚ªI—¹‚·‚邯AMCMCƒTƒ“ƒvƒŠƒ“ƒO‚ªŽn‚Ü‚éBMCMCƒTƒ“ƒvƒŠƒ“ƒO‚ªI—¹‚·‚邯A‚Ü‚¸ij‚ÌŽ–Œã•ª•z‚ª•\ަ‚³‚ê‚éi}A‚QjB

 

}A2

 

}A2‚ÌWindow‚ð•‚¶‚邯A}A3‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}A3

 

}A3‚ÌWindow‚ð•‚¶‚邯A}A4‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}A4

 

}A1‚Ì•\‚̃f[ƒ^‚ð”ä—¦‚É’¼‚µ‚Ä•\ަ‚µ‚½‚à‚Ìi³•ûŒ`j‚ÆAƒ‚ƒfƒ‹—\‘ª’l‚ÌŽ–Œã•ª•z‚Ì’†‰›’li¬‰~j‚̃Oƒ‰ƒt‚Å‚ ‚éB³•ûŒ`iƒf[ƒ^j‚Ƭ‰~iƒ‚ƒfƒ‹j‚ªd‚È‚Á‚Ä‚¢‚é‚Ì‚ÅAƒ‚ƒfƒ‹‚̓f[ƒ^‚ɂ悭“K‡‚µ‚Ä‚¢‚邯Œ¾‚¦‚éB

 

}A4‚ÌWindow‚ð•‚¶‚邯AŽÀsI—¹‚Å‚ ‚éB’[––‚É‚ÍAˆÈ‰º‚̃ƒbƒZ[ƒW‚ª•\ަ‚³‚ê‚Ä‚¢‚éB

 

 

Results.txt was saved.

 

(stan) *****/sdt_simple$

 

ƒtƒ@ƒCƒ‹Results.txt‚ðŠJ‚­‚ÆAˆÈ‰º‚̂悤‚Å‚ ‚éB

 

Input Data File = Data2Cat.csv

<N, S>: [30, 70]

<S, N>: [84, 16]

               Mean      MCSE    StdDev  ...  ESS_tail  ESS_bulk/s    R_hat

lp__    -106.038000  0.023853  0.963004  ...   2150.88     56747.7  1.00161

mu_s       1.082450  0.002467  0.139474  ...   2555.86    106729.0  1.00049

tau        0.332082  0.002353  0.141214  ...   2626.98    120047.0  1.00110

p_NS[1]    0.299458  0.000708  0.045674  ...   2611.75    137324.0  1.00131

p_NS[2]    0.700542  0.000708  0.045674  ...   2611.75    137324.0  1.00132

p_SN[1]    0.161207  0.000665  0.035739  ...   2398.93     98051.0  1.00053

p_SN[2]    0.838793  0.000665  0.035739  ...   2398.93     98051.0  1.00053

 

[7 rows x 11 columns]

 

d':

Med. = 1.083,  90%CI = [0.852, 1.315

tau:

Med. = 0.334,  90%CI ~ [0.100, 0.562]

 

 

 

 

ƒŠƒXƒgA1@‚QAFC‚ÌStanƒXƒNƒŠƒvƒgiSDT2AFC2Cat.stanj

 

data {

    array[2] int n_NS;

    array[2] int n_SN;

}

parameters {

    real mu_s;

    real tau;

}

transformed parameters {

    simplex[2] p_NS;

    simplex[2] p_SN;

    p_NS[1] = Phi(-(mu_s - tau)/sqrt(2.0));

    p_NS[2] = 1 - p_NS[1];

    p_SN[1] = Phi(-(mu_s + tau)/sqrt(2.0));

    p_SN[2] = 1 - p_SN[1];

}

model {

    mu_s ~ normal(0.0, 100.0);

    tau ~ normal(0.0, 100.0);

    n_NS ~ multinomial(p_NS);

    n_SN ~ multinomial(p_SN);

}

 

 

 

ƒŠƒXƒgA2@ƒŠƒXƒgA1‚ÌStanƒXƒNƒŠƒvƒg‚ð—p‚¢‚éPythonƒXƒNƒŠƒvƒgiSDT2AFC2Cat.pyj

 

from cmdstanpy import CmdStanModel

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import csv

import seaborn as sb

 

flnm = input('“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼(*.csv) = ')

with open(flnm, 'r') as f:

    data = [v for v in csv.reader(f)]

 

fout_nm = input('o—̓eƒLƒXƒgƒtƒ@ƒCƒ‹–¼(*.txt) = ')

fout = open(fout_nm, 'w')

fout.write('Input Data File = {}\n'.format(flnm))

   

Freq_NS = []

Freq_NS.append(int(data[1][1]))

Freq_NS.append(int(data[1][2]))

Freq_SN = []

Freq_SN.append(int(data[2][1]))

Freq_SN.append(int(data[2][2]))

print(Freq_NS)

print(Freq_SN)

fout.write('<N, S>: {}'.format(Freq_NS))

fout.write('\n<S, N>: {}'.format(Freq_SN))

TN_NS = sum(Freq_NS)

Rating_NS = []

Rating_NS.append(Freq_NS[0])

Rating_NS.append(Freq_NS[1])

 

TN_SN = sum(Freq_SN)

Rating_SN = []

Rating_SN.append(TN_SN - Freq_SN[0])

Rating_SN.append(TN_SN - Freq_SN[1])

 

Data = {'n_NS': Rating_NS, 'n_SN': Rating_SN}

 

model = CmdStanModel(stan_file='SDT2AFC2Cat.stan')

fit = model.sample(data=Data)  

 

print(fit.summary())

fout.write(f'\n{fit.summary()}\n')

 

 

fit = fit.draws_pd()

 

 

mu = fit['mu_s']

tau = fit['tau']

p_NS = np.array([fit['p_NS[1]'], fit['p_NS[2]']]).T  

p_SN = np.array([fit['p_SN[1]'], fit['p_SN[2]']]).T

 

mu_L05 = np.percentile(mu, 5)

mu_med = np.percentile(mu, 50)

mu_U95 = np.percentile(mu, 95)

fout.write("\nd': \nMed. = {0:<.3f},  90%CI = [{1:<.3f}, {2:<.3f}".

           format(mu_med, mu_L05, mu_U95))

 

tau_L05 = np.percentile(tau, 5)

tau_med = np.percentile(tau, 50)

tau_U95 = np.percentile(tau, 95)

fout.write('\ntau: \nMed. = {0:<.3f},  90%CI ~ [{1:<.3f}, {2:<.3f}]'.

           format(tau_med, tau_L05, tau_U95))

 

p1 = np.median(p_NS, axis = 0)   #    [P(1|NS), P(2|NS)]

p2 = np.median(p_SN, axis = 0)

p2 = [p2[1], p2[0]]              #    [P(2|SN), P(1|SN)]

 

 

sb.kdeplot(mu)

plt.xlabel(r"d'($\mu_S$)", fontsize = 14)

plt.title(r"Posterior Distribution of d'($\mu_S$)" + \

          '\nMed. = {0:<.3f},  90%CI = [{1:M<.3f}, {2:<.3f}]'.

          format(mu_med, mu_L05, mu_U95), fontsize = 16)

plt.show()

 

 

sb.kdeplot(tau)

plt.xlabel(r'$\tau$', fontsize = 18)

plt.title(r'Posterior Distribution of $\tau$' + \

          '\nMed. = {0:<.3f},  90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(tau_med, tau_L05, tau_U95), fontsize = 16)

plt.show()

 

xcat = [1, 2]

xlabels = ['Cat-1', 'Cat-2']

y1 = [Freq_NS[0]/TN_NS, Freq_NS[1]/TN_NS]

y2 = [Freq_SN[0]/TN_SN, Freq_SN[1]/TN_SN]

 

plt.plot(xcat, y1, c='b', marker='s', markersize=20,

         linewidth = 0, label = 'Data/<N, S>')

plt.plot(xcat, p1, c='g', marker='o', markersize=30, fillstyle='none',

         linewidth = 0, markeredgewidth = 3, label = 'Model/<N, S>')

plt.plot(xcat, y2, c='r', marker='s', markersize=20,

         linewidth = 0, label = 'Data/<S, N>')

plt.plot(xcat, p2, c='m', marker='o', markersize=30, fillstyle='none',

         linewidth = 0, markeredgewidth=3, label = 'Model/<S, N>')

plt.xticks(xcat, xlabels, fontsize = 14)

plt.xlim(0.8, 2.2)

plt.xlabel('Rating Category', fontsize = 14)

plt.ylabel('Probability/Proportion', fontsize = 14)

plt.yticks(np.arange(0,1.1,0.2))

plt.title('Rating in Conditions <N, S> and <S, N>', fontsize = 18)

plt.legend(fontsize=18, loc='center')

plt.show()

     

fout.close()

print('\n' + fout_nm + ' was saved.\n')

 

 

 

 

“™•ªŽUƒ‚ƒfƒ‹iŠï”ŒÂ‚Ì•]’èƒJƒeƒSƒŠ‚ð—p‚¢‚éê‡j

 

 

”»’f‚̃JƒeƒSƒŠ”K‚ªŠï”‚ÌꇂÌStanƒXƒNƒŠƒvƒg‚ðƒŠƒXƒgB‚P‚̂悤‚É—pˆÓ‚µ‚½BƒŠƒXƒgB1‚ÌStanƒXƒNƒŠƒvƒg‚ðŽg‚Á‚ăxƒCƒY•ªÍ‚ðs‚¤PythonƒXƒNƒŠƒvƒg‚ðƒŠƒXƒgB2‚̂悤‚É—pˆÓ‚µ‚½BƒŠƒXƒgB1‚̃tƒ@ƒCƒ‹iSDT2AFCOddCat.stanjAƒŠƒXƒgB2‚̃tƒ@ƒCƒ‹iSDT2AFCOddCat.pyjA‚¨‚æ‚Ñ“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚𓯂¶ƒtƒHƒ‹ƒ_‚É’u‚­B‚»‚̃tƒHƒ‹ƒ_‚ɃJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠiƒtƒ@ƒCƒ‹j‚ðˆÚ‚µACmdStanPy‚̃Cƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚éŠÂ‹«‚É‚¨‚¢‚ÄŽŸ‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚éB‚È‚¨ACmdStanPy€”õ‚ÌŠÈ’P‚Èà–¾‚ðA‚±‚̃EƒFƒuƒTƒCƒg‚Ås‚Á‚½B

 

(stan) *****/sdt_oddcat$ python SDT2AFCOddCat.py

 

ã‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚邯A“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚Æo—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚Ìݒ肪‹‚ß‚ç‚ê‚éB

 

(stan) *****/sdt_oddcat$ python SDT2AFCOddCat.py

“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹(*.csv) = Data5Cat.csv

o—̓eƒLƒXƒgƒtƒ@ƒCƒ‹–¼ = Results.txt

 

“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚ÍACSVŒ`Ž®‚̃tƒ@ƒCƒ‹‚Æ‚µ‚Ä—pˆÓ‚·‚éi}B1jBExcel‚Ìê‡Aƒtƒ@ƒCƒ‹Šg’£Žq‚Æ‚µ‚Äu.csvv‚ð‘I‚Ô‚ÆACSVŒ`Ž®‚̃tƒ@ƒCƒ‹‚Æ‚µ‚ĕۑ¶‚³‚ê‚éB

 

}B1

 

}B1‚ÍA”»’fƒJƒeƒSƒŠ”‚ª‚T‚Ìꇂ̗á‚Å‚ ‚éB‘æ‚Ps–Ú‚ÍA•Ï”–¼iƒJƒeƒSƒŠ–¼j‚Ì–¼‘O‚ðÝ’è‚·‚邪AƒvƒƒOƒ‰ƒ€‚ł͗p‚¢‚È‚¢‚̂ŔCˆÓ‚Ì•¶Žš—ñ‚ł悢B‚½‚¾‚µA‘æ‚Ps–Ú‘æ‚P—ñ–Ú‚É•¶Žš—ñID‚ðÝ’è‚·‚邯AExcel‚Ìê‡A“ǂݞ‚ÝŽž‚ɃGƒ‰[ƒƒbƒZ[ƒW‚ª•\ަ‚³‚ê‚邱‚Æ‚ª‚ ‚邪A‚±‚ê‚Í–³Ž‹‚·‚éB‘æ‚Qs–Ú‚ÉŽhŒƒ’ñަðŒƒNAS>i—Ⴆ‚ÎA¶‚ɃmƒCƒYŽhŒƒA‰E‚ɃVƒOƒiƒ‹ŽhŒƒj‚É‚¨‚¯‚éƒf[ƒ^‚ðÝ’è‚·‚éB‘æ‚Q—ñ–Ú‚ÉuƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚R—ñ–Ú‚Éu‘½•ªAƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚S—ñ–Ú‚Éu‚í‚©‚ç‚È‚¢v‚Æ”»’f‚³‚ꂽ“x”A‘æ‚T—ñ–Ú‚Éu‚½‚Ô‚ñAƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚U—ñ–Ú‚ÉuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”‚ðÝ’è‚·‚éB

‘æ‚Rs–Ú‚ÉŽhŒƒ’ñަðŒƒSAN„i—Ⴆ‚ÎA¶‚ɃVƒOƒiƒ‹ŽhŒƒA‰E‚ɃmƒCƒYŽhŒƒj‚É‚¨‚¯‚éƒf[ƒ^‚ðÝ’è‚·‚éB‘æ‚Q—ñ–Ú‚ÉuƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚R—ñ–Ú‚Éu‘½•ªAƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚S—ñ–Ú‚Éu‚í‚©‚ç‚È‚¢v‚Æ”»’f‚³‚ꂽ“x”A‘æ‚T—ñ–Ú‚Éu‚½‚Ô‚ñAƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚U—ñ–Ú‚ÉuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”‚ðÝ’è‚·‚éB

ƒf[ƒ^‚Ìݒ肪I‚í‚ê‚ÎAƒtƒ@ƒCƒ‹Šg’£Žq‚Æ‚µ‚Äu.csvv‚ð‘I‚ñ‚ŕۑ¶‚·‚邯ACSVŒ`Ž®‚̃tƒ@ƒCƒ‹‚Æ‚µ‚ĕۑ¶‚³‚ê‚éB

 

“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚ÌÝ’è‚É‘±‚¢‚ÄAo—̓tƒ@ƒCƒ‹–¼‚ÌÝ’è‚ðs‚¤‚ªAo—̓tƒ@ƒCƒ‹–¼‚̓eƒLƒXƒgƒtƒ@ƒCƒ‹–¼iƒtƒ@ƒCƒ‹Šg’£Žq‚ªu.txtvj‚Å‚ ‚ê‚ÎA”CˆÓ‚Å‚ ‚éB

 

ƒtƒ@ƒCƒ‹–¼‚Ìݒ肪I‚í‚邯Aƒtƒ@ƒCƒ‹‚ª“ǂݞ‚Ü‚êAStanƒXƒNƒŠƒvƒg‚̃Rƒ“ƒpƒCƒ‹‚ªŽn‚Ü‚éBƒRƒ“ƒpƒCƒ‹‚ɂ͑½­‚ÌŽžŠÔ‚ªŠ|‚©‚éBƒRƒ“ƒpƒCƒ‹ŒãAMCMCƒTƒ“ƒvƒŠƒ“ƒO‚ªŽn‚Ü‚èAMCMCƒTƒ“ƒvƒŠƒ“ƒOŒãA}B2‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}B2

 

ƒpƒ‰ƒ[ƒ^‚ÌŽ–Œã•ª•z‚Å‚ ‚éB

}B2‚ÌWindow‚ð•‚¶‚邯A}B3‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}B3

 

ƒpƒ‰ƒ[ƒ^‚ÌŽ–Œã•ª•z‚̃Oƒ‰ƒt‚Å‚ ‚éB

}B3‚ÌWindow‚ð•‚¶‚邯A}B4‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}B4

 

”»’f‚̃JƒeƒSƒŠ‹«ŠE‚ÌŽ–Œã•ª•z‚Å‚ ‚éB

}B4‚ÌWindow‚ð•‚¶‚邯A}B‚T‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}B5

 

}B1‚Ì•\‚̃f[ƒ^‚ð”ä—¦‚É’¼‚µ‚Ä•\ަ‚µ‚½‚à‚Ìi³•ûŒ`j‚ÆAƒ‚ƒfƒ‹—\‘ª’l‚ÌŽ–Œã•ª•z‚Ì’†‰›’li¬‰~j‚̃Oƒ‰ƒt‚Å‚ ‚éB³•ûŒ`iƒf[ƒ^j‚Ƭ‰~iƒ‚ƒfƒ‹j‚Ìd‚Ȃ肪‚æ‚¢‚Ì‚ÅAƒ‚ƒfƒ‹‚̓f[ƒ^‚ɂ悭“K‡‚µ‚Ä‚¢‚邯Œ¾‚¦‚éB

 

}B‚T‚ÌWindow‚ð•‚¶‚邯AŽÀsI—¹‚Å‚ ‚éB’[––‚É‚ÍAˆÈ‰º‚̃ƒbƒZ[ƒW‚ª•\ަ‚³‚ê‚Ä‚¢‚éB

 

Results.txt was saved.

 

(stan) *****/sdt_oddcat$

 

 

o—̓tƒ@ƒCƒ‹Results.txt‚ðŠJ‚­‚ÆAˆÈ‰º‚̂悤‚È“à—e‚Å‚ ‚éB

 

 

Input Data File = Data5Cat.csv

 

<N, S>

[21, 10, 5, 18, 46]

 

<S, N>

[66, 10, 7, 12, 5]

 

                Mean      MCSE    StdDev  ...  ESS_tail  ESS_bulk/s    R_hat

lp__     -270.337000  0.033033  1.459580  ...   2942.01     25956.6  1.00054

mu_s        0.931202  0.001831  0.118723  ...   3102.69     53068.0  1.00049

tau         0.385409  0.001735  0.115954  ...   3512.09     56082.4  1.00056

theta[1]    0.140015  0.000583  0.037475  ...   2969.47     50438.4  1.00009

theta[2]    0.578691  0.001213  0.073092  ...   2720.57     43876.1  1.00065

C[1]       -0.718706  0.001237  0.079069  ...   2831.07     50589.4  1.00061

C[2]       -0.140015  0.000583  0.037475  ...   2969.47     50438.4  1.00009

C[3]        0.140015  0.000583  0.037475  ...   2969.47     50438.4  1.00009

C[4]        0.718706  0.001237  0.079069  ...   2831.07     50589.4  1.00061

p_NS[1]     0.187613  0.000536  0.034582  ...   3017.60     52503.5  1.00049

p_NS[2]     0.127419  0.000259  0.016823  ...   3312.71     52788.9  1.00086

p_NS[3]     0.072758  0.000302  0.019428  ...   2859.19     50721.2  1.00072

p_NS[4]     0.160512  0.000334  0.020278  ...   2558.40     44966.5  1.00053

p_NS[5]     0.451698  0.000672  0.047737  ...   3372.57     63257.1  1.00093

p_SN[1]     0.077157  0.000330  0.020760  ...   2816.51     49380.9  1.00169

p_SN[2]     0.076247  0.000191  0.012534  ...   3283.69     53404.2  1.00102

p_SN[3]     0.051098  0.000227  0.014653  ...   2952.11     50882.3  1.00078

p_SN[4]     0.132891  0.000309  0.019267  ...   3104.66     47175.8  1.00127

p_SN[5]     0.662607  0.000663  0.044700  ...   3276.61     55393.9  1.00055

 

[19 rows x 11 columns]

 

d':

Median = 0.931,   90%CI = [0.739, 1.126]

 

tau:

Median = 0.388,   90%CI = [0.195, 0.579]

 

C[1]:

Median = -0.717,   90%CI = [-0.852, -0.592]

 

C[2]:

Median = -0.136,   90%CI = [-0.205, -0.085]

 

C[3]:

Median = 0.136,   90%CI = [0.085, 0.205]

 

C[4]:

Median = 0.717,   90%CI = [0.592, 0.852]

 

 

MCMCƒTƒ“ƒvƒŠƒ“ƒO‚Ì“ŒvAƒpƒ‰ƒ[ƒ^‚ÌŽ–Œã•ª•z‚Ì’†‰›’l‚ȂǂªŽ¦‚³‚ê‚Ä‚¢‚éB

 

 

 

 

ƒŠƒXƒgB1@Šï”ŒÂ‚Ì•]’èƒJƒeƒSƒŠ”‚ÌStanƒXƒNƒŠƒvƒgiSDT2AFCOddCat.stanj

 

//

//      Number of rating categories should be odd

//

//              Yasuharu Okamoto,   2019.10, 2025.10

//

functions {

    real half_normal_lpdf(real y, real sgm){

        if (y > 0.0){

            return normal_lpdf(y | 0.0, sgm);

        } else {

            return log(0.0);

        }

    }

}

data {

    int K;

    array[K] int n_NS;

    array[K] int n_SN;

}

 

parameters {

    real mu_s;

    real tau;

    array[(K - 1) / 2] real<lower = 0.0> theta;

}

transformed parameters {

    array[K - 1] real C;

    simplex[K] p_NS;

    simplex[K] p_SN;

    C[(K - 1) / 2 + 1] = theta[1];

    C[(K - 1) / 2] = -C[(K - 1) / 2 + 1];

    for (k in 2: ((K - 1) / 2)){

        C[(K - 1) /2 + k] = C[(K - 1) / 2 + k - 1] + theta[k];

        C[(K - 1) / 2 - k + 1] = -C[(K - 1) / 2 + k];

    }

    p_NS[1] = Phi((C[1] - (mu_s - tau))/sqrt(2.0));

    p_NS[K] = 1 - Phi((C[K - 1] - (mu_s - tau))/sqrt(2.0));

 

    for (k in 2:(K-1)) {

        p_NS[k] = Phi((C[k] - (mu_s - tau))/sqrt(2.0)) -

                   Phi((C[k - 1] - (mu_s - tau))/sqrt(2.0));

    }

 

    p_SN[1] = Phi((C[1] - (mu_s + tau))/sqrt(2.0));

    p_SN[K] = 1 - Phi((C[K - 1] - (mu_s + tau))/sqrt(2.0));

   

    for (k in 2:(K-1)) {

        p_SN[k] = Phi((C[k] - (mu_s + tau))/sqrt(2.0)) -

                   Phi((C[k - 1] - (mu_s + tau))/sqrt(2.0));

    }

}

model {

    for (k in 1:((K - 1) / 2)) {

        theta[k] ~ half_normal(1000.0);

    }

    mu_s ~ normal(0.0, 100.0);

    tau ~ normal(0.0, 100.0);

    n_NS ~ multinomial(p_NS);

    n_SN ~ multinomial(p_SN);

}

 

 

 

ƒŠƒXƒgB2@ƒŠƒXƒgB1‚ÌStanƒXƒNƒŠƒvƒg‚ð—p‚¢‚éPythonƒXƒNƒŠƒvƒgiSDT2AFCOddCat.pyj

 

#

#           Yasuharu Okamoto,   2019.10, 2025.10

#

from cmdstanpy import CmdStanModel

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sb

import csv

 

flnm = input('“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹(*.csv) = ')

with open(flnm, 'r') as f:

    data = [v for v in csv.reader(f)]

fout_nm = input('o—̓eƒLƒXƒgƒtƒ@ƒCƒ‹–¼ = ')

fout = open(fout_nm, 'w')

fout.write('\nInput Data File = {}\n'.format(flnm))

 

K = len(data[0]) - 1

print('K = ', K)

if (K % 2) == 0:

    print('ƒJƒeƒSƒŠ” K ‚͊łȂ¯‚ê‚΂Ȃç‚È‚¢I')

    import sys

    sys.exit()

   

Freq_NS = []

for k in range(K):

    Freq_NS.append(int(data[1][1 + k]))

Freq_SN = []

for k in range(K):

    Freq_SN.append(int(data[2][1 + k]))

print(Freq_NS)

print(Freq_SN)

fout.write('\n<N, S>\n{}\n'.format(Freq_NS))

fout.write('\n<S, N>\n{}\n'.format(Freq_SN))           

TN_NS = sum(Freq_NS)

Rating_NS = Freq_NS

TN_SN = sum(Freq_SN)

Rating_SN = []

for k in range(K):

    Rating_SN.append(Freq_SN[K - 1 - k])

 

Data = {'K': K, 'n_NS': Rating_NS, 'n_SN': Rating_SN}

 

model = CmdStanModel(stan_file='SDT2AFCOddCat.stan')

fit = model.sample(data=Data) 

 

print(fit.summary())

fout.write(f'\n{fit.summary()}\n')

 

fit = fit.draws_pd()

 

mu = fit['mu_s']

tau = fit['tau']

C = []

for k in range(K-1):

    C.append(fit[f'C[{k+1}]'])

C = np.array(C).T

p_NS = []

p_SN = []

for k in range(K):

    p_NS.append(fit[f'p_NS[{k+1}]'])

    p_SN.append(fit[f'p_SN[{k+1}]'])

p_NS = np.array(p_NS).T

p_SN = np.array(p_SN).T

 

mu_L05 = np.percentile(mu, 5)

mu_med = np.percentile(mu, 50)

mu_U95 = np.percentile(mu, 95)

fout.write("\nd':\nMedian = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]\n".

           format(mu_med, mu_L05, mu_U95))

 

tau_L05 = np.percentile(tau, 5)

tau_med = np.percentile(tau, 50)

tau_U95 = np.percentile(tau, 95)

fout.write('\ntau:\nMedian = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]\n'.

           format(tau_med, tau_L05, tau_U95))

 

C_L05 = np.zeros(K-1)

C_med = np.zeros(K-1)

C_U95 = np.zeros(K-1)

for k in range(K-1):

    C_L05[k] = np.percentile(C.T[k], 5)

    C_med[k] = np.percentile(C.T[k], 50)

    C_U95[k] = np.percentile(C.T[k], 95)

for k in range(K-1):

    fout.write(('\nC[{0}]:\n' + \

               'Median = {1:<.3f},   90%CI = [{2:<.3f}, {3:<.3f}]\n').

               format(k+1, C_med[k], C_L05[k], C_U95[k]))

 

sb.kdeplot(mu)

plt.xlabel(r"d'($\mu_S$)", fontsize = 14)

plt.title(r"Posterior Distribution of d'($\mu_S$)" + \

          '\nMed. = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(mu_med, mu_L05, mu_U95), fontsize = 16)

plt.show()

 

sb.kdeplot(tau)

plt.xlabel(r'$\tau$', fontsize = 18)

plt.title(r'Posterior Distribution of $\tau$' + \

          '\nMed. = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(tau_med, tau_L05, tau_U95), fontsize = 16)

plt.show()

 

for k in range(K-1):

    sb.kdeplot(C.T[k], label = 'C{}'.format(k+1))

plt.title('Posterior Distributions of Category Boundaries', fontsize = 18)

plt.legend()

plt.show()

 

p1 = np.median(p_NS, axis = 0)

p2 = np.median(p_SN, axis = 0)

p2 = np.flip(p2)

 

xcat = np.arange(1, K+0.1, 1)

xlabels = ['{}'.format(int(v)) for v in xcat]

y1 = []

y2 = []

for k in range(K):

    y1.append(Freq_NS[k]/TN_NS)

    y2.append(Freq_SN[k]/TN_SN)

   

plt.plot(xcat, y1, c='b', marker='s', markersize=20,

         linewidth = 0, label = 'Data/<N, S>')

plt.plot(xcat, p1, c='g', marker='o', markersize=30, fillstyle='none',

         linewidth = 0, markeredgewidth=3, label = 'Model/<N, S>')

plt.plot(xcat, y2, c='r', marker='s', markersize=20,

         linewidth = 0, label = 'Data/<S, N>')

plt.plot(xcat, p2, c='m', marker='o', markersize=30, fillstyle='none',

         linewidth = 0, markeredgewidth=3, label = 'Model/<S, N>')

 

plt.xticks(xcat, xlabels, fontsize = 14)

plt.xlabel('Rating Category', fontsize = 14)

plt.ylabel('Probability/Proportion', fontsize = 14)

plt.yticks(np.arange(0, 1.01, 0.2))

plt.title('Ratings in Conditions <N, S> and <S, N>', fontsize = 18)

plt.legend(loc = 'upper center', fontsize = 18)

plt.show()

 

fout.close()

print('\n{} was saved.\n'.format(fout_nm))

 

 

 

 

“™•ªŽUƒ‚ƒfƒ‹i‹ô”ŒÂ‚Ì•]’èƒJƒeƒSƒŠ‚ð—p‚¢‚éê‡j

 

”»’f‚̃JƒeƒSƒŠ”K‚ª‹ô”‚ÌꇂÌStanƒXƒNƒŠƒvƒg‚ðƒŠƒXƒgC1‚̂悤‚É—pˆÓ‚µ‚½BƒŠƒXƒgC1‚ÌStanƒXƒNƒŠƒvƒg‚ðŽg‚Á‚ăxƒCƒY•ªÍ‚ðs‚¤PythonƒXƒNƒŠƒvƒg‚ðƒŠƒXƒgC2‚̂悤‚É—pˆÓ‚µ‚½BƒŠƒXƒgC1‚̃tƒ@ƒCƒ‹iSDT2AFCEvenCat.stanjAƒŠƒXƒgC2‚̃tƒ@ƒCƒ‹iSDT2AFCEvenCat.pyjA‚¨‚æ‚Ñ“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚𓯂¶ƒtƒHƒ‹ƒ_‚É’u‚­B‚»‚̃tƒHƒ‹ƒ_‚ɃJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠiƒtƒ@ƒCƒ‹j‚ðˆÚ‚µACmdStanPy‚̃Cƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚éŠÂ‹«‚É‚¨‚¢‚ÄŽŸ‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚éB‚È‚¨ACmdStanPy€”õ‚ÌŠÈ’Pà–¾‚ðA‚±‚̃EƒFƒuƒTƒCƒg‚Ås‚Á‚½B

 

(stan) *****/sdt_evencat$ python SDT2AFCEvenCat.py

 

 

ã‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚邯A“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚Æo—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚Ìݒ肪‹‚ß‚ç‚ê‚éB

 

(stan) *****/sdt_evencat$ python SDT2AFCEvenCat.py

“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼(*.csv) = Data4Cat.csv

o—̓eƒLƒXƒgƒtƒ@ƒCƒ‹–¼ = Results.txt

 

“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚ÍACSVŒ`Ž®‚̃tƒ@ƒCƒ‹‚Æ‚µ‚Ä—pˆÓ‚·‚éi}C1jBExcel‚Ìê‡Aƒtƒ@ƒCƒ‹Šg’£Žq‚Æ‚µ‚Äu.csvv‚ð‘I‚Ô‚ÆACSVŒ`Ž®‚̃tƒ@ƒCƒ‹‚Æ‚µ‚ĕۑ¶‚³‚ê‚éB

 

}C1

 

}C1‚ÍA”»’fƒJƒeƒSƒŠ”‚ª‚S‚Ìꇂ̗á‚Å‚ ‚éB‘æ‚Ps–ڂ͕ϔ–¼iƒJƒeƒSƒŠ–¼j‚Ì–¼‘O‚ðÝ’è‚·‚邪AƒvƒƒOƒ‰ƒ€‚ł͗p‚¢‚È‚¢‚̂ŔCˆÓ‚Ì•¶Žš—ñ‚ł悢B‚½‚¾‚µA‘æ‚Ps–Ú‘æ‚P—ñ–Ú‚É•¶Žš—ñID‚ðÝ’è‚·‚邯AExcel‚Ìê‡A“ǂݞ‚ÝŽž‚ɃGƒ‰[ƒƒbƒZ[ƒW‚ª•\ަ‚³‚ê‚邱‚Æ‚ª‚ ‚邪A‚±‚ê‚Í–³Ž‹‚·‚éB‘æ‚Qs–Ú‚ÉŽhŒƒ’ñަðŒƒNAS>i—Ⴆ‚ÎA¶‚ɃmƒCƒYŽhŒƒA‰E‚ɃVƒOƒiƒ‹ŽhŒƒj‚É‚¨‚¯‚éƒf[ƒ^‚ðÝ’è‚·‚éB‘æ‚Q—ñ–Ú‚ÉuƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚R—ñ–Ú‚Éu‘½•ªAƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚S—ñ–Ú‚Éu‚½‚Ô‚ñAƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚T—ñ–Ú‚ÉuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”‚ðÝ’è‚·‚éB

‘æ‚Rs–Ú‚ÉŽhŒƒ’ñަðŒƒSAN„i—Ⴆ‚ÎA¶‚ɃVƒOƒiƒ‹ŽhŒƒA‰E‚ɃmƒCƒYŽhŒƒj‚É‚¨‚¯‚éƒf[ƒ^‚ðÝ’è‚·‚éB‘æ‚Q—ñ–Ú‚ÉuƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚R—ñ–Ú‚Éu‘½•ªAƒVƒOƒiƒ‹‚Í‘æ‚PˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚Ͷ‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚S—ñ–Ú‚Éu‚½‚Ô‚ñAƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”A‘æ‚T—ñ–Ú‚ÉuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éiƒVƒOƒiƒ‹ŽhŒƒ‚͉E‚Å‚ ‚éjv‚Æ”»’f‚³‚ꂽ“x”‚ðÝ’è‚·‚éB

ƒf[ƒ^‚Ìݒ肪I‚í‚ê‚ÎAƒtƒ@ƒCƒ‹Šg’£Žq‚Æ‚µ‚Äu.csvv‚ð‘I‚ñ‚ŕۑ¶‚·‚邯ACSVŒ`Ž®‚̃tƒ@ƒCƒ‹‚Æ‚µ‚ĕۑ¶‚³‚ê‚éB

 

“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚ÌÝ’è‚É‘±‚¢‚ÄAo—̓tƒ@ƒCƒ‹–¼‚ÌÝ’è‚ðs‚¤‚ªAo—̓tƒ@ƒCƒ‹–¼‚̓eƒLƒXƒgƒtƒ@ƒCƒ‹–¼iƒtƒ@ƒCƒ‹Šg’£Žq‚ªu.txtvj‚Å‚ ‚ê‚ÎA”CˆÓ‚Å‚ ‚éB

 

ƒtƒ@ƒCƒ‹–¼‚Ìݒ肪I‚í‚邯Aƒtƒ@ƒCƒ‹‚ª“ǂݞ‚Ü‚êAStanƒXƒNƒŠƒvƒg‚̃Rƒ“ƒpƒCƒ‹‚ªŽn‚Ü‚éBƒRƒ“ƒpƒCƒ‹‚ɂ͑½­‚ÌŽžŠÔ‚ªŠ|‚©‚éBƒRƒ“ƒpƒCƒ‹ŒãAMCMCƒTƒ“ƒvƒŠƒ“ƒO‚ªŽn‚Ü‚èAMCMCƒTƒ“ƒvƒŠƒ“ƒOŒãA}C2‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}C2

 

ƒpƒ‰ƒ[ƒ^‚ÌŽ–Œã•ª•z‚Å‚ ‚éB

}C2‚ÌWindow‚ð•‚¶‚邯A}C3‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}C3

 

ƒpƒ‰ƒ[ƒ^‚ÌŽ–Œã•ª•z‚̃Oƒ‰ƒt‚Å‚ ‚éB

}C3‚ÌWindow‚ð•‚¶‚邯A}C4‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}C4

 

”»’f‚̃JƒeƒSƒŠ‹«ŠE‚ÌŽ–Œã•ª•z‚Å‚ ‚éB’†‰›‚̃JƒeƒSƒŠ‹«ŠE’lA}C4‚ÌꇂÍC2A‚͂ɌŒ肳‚ê‚Ä‚¢‚éiŽ®i‚Tjj‚Ì‚ÅA}C4‚̃Oƒ‰ƒt‚ɂ͕\ަ‚³‚ê‚Ä‚¢‚È‚¢B

}C4‚ÌWindow‚ð•‚¶‚邯A}C‚T‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}C5

 

}C1‚Ì•\‚̃f[ƒ^‚ð”ä—¦‚É’¼‚µ‚Ä•\ަ‚µ‚½‚à‚Ìi³•ûŒ`j‚ÆAƒ‚ƒfƒ‹—\‘ª’l‚ÌŽ–Œã•ª•z‚Ì’†‰›’li¬‰~j‚̃Oƒ‰ƒt‚Å‚ ‚éB³•ûŒ`iƒf[ƒ^j‚Ƭ‰~iƒ‚ƒfƒ‹j‚Ìd‚Ȃ肪‚æ‚¢‚Ì‚ÅAƒ‚ƒfƒ‹‚̓f[ƒ^‚ɂ悭“K‡‚µ‚Ä‚¢‚邯Œ¾‚¦‚éB

 

}C‚T‚ÌWindow‚ð•‚¶‚邯AŽÀsI—¹‚Å‚ ‚éB’[––‚É‚ÍAˆÈ‰º‚̃ƒbƒZ[ƒW‚ª•\ަ‚³‚ê‚Ä‚¢‚éB

 

Results.txt was saved.

 

(stan) *****/2AFCfiles/sdt_evencat$

 

 

o—̓tƒ@ƒCƒ‹Results.txt‚ðŠJ‚­‚ÆAˆÈ‰º‚̂悤‚È“à—e‚Å‚ ‚éB

 

 

Input Data File = Data4Cat.csv

 

<N, S>

[24, 9, 12, 55]

 

<S, N>

[74, 13, 7, 6]

 

                Mean      MCSE    StdDev  ...  ESS_tail  ESS_bulk/s    R_hat

lp__     -210.013000  0.028870  1.235630  ...   2533.94     24819.8  1.00205

mu_s        1.050070  0.002271  0.127871  ...   3037.34     37836.9  1.00107

tau         0.433704  0.002160  0.125256  ...   2805.00     40400.1  1.00231

theta[1]    0.505888  0.001185  0.070206  ...   2548.88     41632.2  1.00079

C[1]       -0.505888  0.001185  0.070206  ...   2548.88     41632.2  1.00079

C[2]        0.000000       NaN  0.000000  ...       NaN         NaN      NaN

C[3]        0.505888  0.001185  0.070206  ...   2548.88     41632.2  1.00079

p_NS[1]     0.215756  0.000644  0.038867  ...   3008.57     43619.5  1.00047

p_NS[2]     0.116810  0.000255  0.015828  ...   2472.62     45541.1  1.00071

p_NS[3]     0.136530  0.000325  0.019622  ...   2377.75     42978.1  1.00059

p_NS[4]     0.530904  0.000750  0.048415  ...   2947.36     49534.6  1.00227

p_SN[1]     0.082127  0.000455  0.022824  ...   2545.22     30228.1  1.00084

p_SN[2]     0.067085  0.000190  0.011896  ...   2381.59     45704.8  1.00128

p_SN[3]     0.097352  0.000264  0.017272  ...   2403.68     50376.1  1.00156

p_SN[4]     0.753435  0.000712  0.041785  ...   2453.56     40455.9  1.00079

 

[15 rows x 11 columns]

 

d':

Median = 1.051,   90%CI = [0.844, 1.262]

 

tau:

Median = 0.432,   90%CI = [0.231, 0.643]

 

C[1]:

Median = -0.504,   90%CI = [-0.626, -0.396]

 

C[2]:

Median = 0.000,   90%CI = [0.000, 0.000]

 

C[3]:

Median = 0.504,   90%CI = [0.396, 0.626]

 

 

MCMCƒTƒ“ƒvƒŠƒ“ƒO‚Ì“ŒvAƒpƒ‰ƒ[ƒ^‚ÌŽ–Œã•ª•z‚Ì’†‰›’l‚ȂǂªŽ¦‚³‚ê‚Ä‚¢‚éB

 

 

 

 

ƒŠƒXƒgC1@‹ô””ŒÂ‚Ì•]’èƒJƒeƒSƒŠ”‚ÌStanƒXƒNƒŠƒvƒgiSDT2AFCEvenCat.stanj

 

//

//      Number of Rating categoriees should be even

//

//              Yasuharu Okamoto, 2019.10, 2025.10

//

functions {

    real half_normal_lpdf(real y, real sgm){

        if (y > 0.0){

            return normal_lpdf(y | 0.0, sgm);

        } else {

            return log(0.0);

        }

    }

}

data {

    int K;

    array[K] int n_NS;

    array[K] int n_SN;

}

 

parameters {

    real mu_s;

    real tau;

    array[K/2 - 1] real<lower = 0.0> theta;

}

transformed parameters {

    array[K-1] real C;

    simplex[K] p_NS;

    simplex[K] p_SN;

    C[K/2] = 0.0;

    for (k in 1: (K/2 -1)){

        C[K/2 + k] = C[K/2 + k - 1] + theta[k];

        C[K/2 - k] = -C[K/2 + k];

    }

    p_NS[1] = Phi((C[1] - (mu_s - tau))/sqrt(2.0));

    p_NS[K] = 1 - Phi((C[K - 1] - (mu_s - tau))/sqrt(2.0));

 

    for (k in 2:(K-1)) {

        p_NS[k] = Phi((C[k] - (mu_s - tau))/sqrt(2.0)) -

                   Phi((C[k - 1] - (mu_s - tau))/sqrt(2.0));

    }

 

    p_SN[1] = Phi((C[1] - (mu_s + tau))/sqrt(2.0));

    p_SN[K] = 1 - Phi((C[K - 1] - (mu_s + tau))/sqrt(2.0));

   

    for (k in 2:(K-1)) {

        p_SN[k] = Phi((C[k] - (mu_s + tau))/sqrt(2.0)) -

                   Phi((C[k - 1] - (mu_s + tau))/sqrt(2.0));

    }

}

model {

    for (k in 1:(K/2 - 1)) {

        theta[k] ~ half_normal(1000.0);

    }

    mu_s ~ normal(0.0, 100.0);

    tau ~ normal(0.0, 100.0);

    n_NS ~ multinomial(p_NS);

    n_SN ~ multinomial(p_SN);

}

 

 

 

 

ƒŠƒXƒgC2@ƒŠƒXƒgC1‚ÌStanƒXƒNƒŠƒvƒg‚ð—p‚¢‚éPythonƒXƒNƒŠƒvƒgiSDT2AFCEvenCat.pyj

 

#

#           Yasuharu Okamoto, 2019.10, 2025.10

#

from cmdstanpy import CmdStanModel

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sb

import csv

import pickle

 

flnm = input('“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼(*.csv) = ')

with open(flnm, 'r') as f:

    data = [v for v in csv.reader(f)]

 

fout_nm = input('o—̓eƒLƒXƒgƒtƒ@ƒCƒ‹–¼ = ')

fout = open(fout_nm, 'w')

fout.write('Input Data File = {}\n'.format(flnm))

 

K = len(data[0]) - 1

print('K = ', K)

if (K % 2) == 1:

    print('•]’èƒJƒeƒSƒŠ”‚Í‹ô”‚łȂ¯‚ê‚΂Ȃç‚È‚¢!')

    import sys

    sys.exit()

   

Freq_NS = []

for k in range(K):

    Freq_NS.append(int(data[1][1 + k]))

Freq_SN = []

for k in range(K):

    Freq_SN.append(int(data[2][1 + k]))

print(Freq_NS)

print(Freq_SN)

fout.write('\n<N, S>\n{}\n'.format(Freq_NS))

fout.write('\n<S, N>\n{}\n'.format(Freq_SN))  

TN_NS = sum(Freq_NS)

Rating_NS = Freq_NS

print(Rating_NS)

TN_SN = sum(Freq_SN)

Rating_SN = []

for k in range(K):

    Rating_SN.append(Freq_SN[K - 1 - k])

 

Data = {'K': K, 'n_NS': Rating_NS, 'n_SN': Rating_SN}

 

model = CmdStanModel(stan_file='SDT2AFCEvenCat.stan')

fit = model.sample(data=Data)  

 

print(fit.summary())

fout.write(f'\n{fit.summary()}\n')

 

 

fit = fit.draws_pd()

 

 

mu = fit['mu_s']

tau = fit['tau']

C = []

for k in range(K-1):

    C.append(fit[f'C[{k+1}]'])

C = np.array(C).T

 

p_NS = []

p_SN = []

for k in range(K):

    p_NS.append(fit[f'p_NS[{k+1}]'])

    p_SN.append(fit[f'p_SN[{k+1}]'])

p_NS = np.array(p_NS).T

p_SN = np.array(p_SN).T

 

mu_L05 = np.percentile(mu, 5)

mu_med = np.percentile(mu, 50)

mu_U95 = np.percentile(mu, 95)

fout.write("\nd':\nMedian = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]\n".

           format(mu_med, mu_L05, mu_U95))

 

tau_L05 = np.percentile(tau, 5)

tau_med = np.percentile(tau, 50)

tau_U95 = np.percentile(tau, 95)

fout.write('\ntau:\nMedian = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]\n'.

           format(tau_med, tau_L05, tau_U95))

 

C_L05 = np.zeros(K-1)

C_med = np.zeros(K-1)

C_U95 = np.zeros(K-1)

for k in range(K-1):

    C_L05[k] = np.percentile(C.T[k], 5)

    C_med[k] = np.percentile(C.T[k], 50)

    C_U95[k] = np.percentile(C.T[k], 95)

for k in range(K-1):

    fout.write(('\nC[{0}]:\n' + \

               'Median = {1:<.3f},   90%CI = [{2:<.3f}, {3:<.3f}]\n').

               format(k+1, C_med[k], C_L05[k], C_U95[k]))

 

sb.kdeplot(mu)

plt.xlabel(r"d'($\mu_S$)", fontsize = 14)

plt.title(r"Posterior Distribution of d'($\mu_S$)" + \

          '\nMed. = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(mu_med, mu_L05, mu_U95), fontsize = 16)

plt.show()

 

sb.kdeplot(tau)

plt.xlabel(r'$\tau$', fontsize = 18)

plt.title(r'Posterior Distribution of $\tau$' + \

          '\nMed. = {0:<.3f},   90%CI = [{1:<.3f}, {2:<.3f}]'.

          format(tau_med, tau_L05, tau_U95), fontsize = 16)

plt.show()

 

for k in range(K-1):

    if k + 1 != K/2:

        sb.kdeplot(C.T[k], label = 'C{}'.format(k+1))

plt.title('Posterior Distributions of Category Boundaries' + \

          '\nC{} = 0 fixed'.format(K//2), fontsize = 16)

plt.legend(loc = 'lower center')

plt.show()

 

xcat = np.arange(1, K+0.1, 1)

xlabels = ['{}'.format(int(v)) for v in xcat]

y1 = []

y2 = []

for k in range(K):

    y1.append(Freq_NS[k]/TN_NS)

    y2.append(Freq_SN[k]/TN_SN)

 

p1 = np.median(p_NS, axis = 0)

p2 = np.median(p_SN, axis = 0)

p2 = np.flip(p2)

 

plt.plot(xcat, y1, c='b', marker='s', markersize=20,

         linewidth = 0, label = 'Data/<N, S>')

plt.plot(xcat, p1, c='g', marker='o', markersize=30, fillstyle='none',

         linewidth = 0, markeredgewidth=3, label = 'Model/<N, S>')

plt.plot(xcat, y2, c='r', marker='s', markersize=20,

         linewidth = 0, label = 'Data/<S, N>')

plt.plot(xcat, p2, c='m', marker='o', markersize=30, fillstyle='none',

         linewidth = 0, markeredgewidth=3, label = 'Model/<S, N>')

 

plt.xticks(xcat, xlabels, fontsize = 14)

plt.xlabel('Rating Category', fontsize = 14)

plt.ylabel('Probability/Proportion', fontsize = 14)

plt.yticks(np.arange(0, 1.01, 0.2))

plt.title('Ratings in Conditions <N, S> and <S, N>', fontsize = 18)

plt.legend(loc = 'upper center', fontsize = 18)

plt.show()

 

fout.close()

print('\n{} was saved.\n'.format(fout_nm))

 

 

 

 

•s“™•ªŽUƒ‚ƒfƒ‹

 

 

Brady‚çi2023j‚ÍA‹L‰¯‚̃pƒtƒH[ƒ}ƒ“ƒX‚ÌŒ¤‹†‚É‚¨‚¢‚Ă͂QAFC‚ð—p‚¢‚邱‚Æ‚ð„§‚µ‚Ä‚¢‚邪A‚³‚ç‚ÉA•s“™•ªŽUƒ‚ƒfƒ‹‚ªROC‹Èü‚ɂ悭‡‚¤‚Æà–¾‚µ‚Ä‚¢‚éip. 442jB2AFC‚ðŠg’£‚µ‚Ä•s“™•ªŽUƒ‚ƒfƒ‹‚ª“K—p‚Å‚«‚邿‚¤‚ÉH•v‚³‚ꂽŽÀŒ±–@‚Æ•ªÍƒ‚ƒfƒ‹‚ª’ñˆÄ‚³‚ê‚Ä‚¢‚éiOkamoto, 2023jB•s“™•ªŽU‚ª—\‘z‚³‚ê‚éꇂÍA‚±‚ÌŠg’£2Žˆ‹­§‘I‘ð•]’è–@‚ð—p‚¢‚邱‚Æ‚ª‚Å‚«‚éB‚Ü‚½A•s“™•ªŽU‚Ƃ͓™•ªŽU‚ð‰¼’è‚µ‚È‚¢‚Æ‚¢‚¤‚±‚Ƃł ‚èAƒf[ƒ^‚ª“™•ªŽU‚Ì‚à‚̂ł ‚Á‚Ä‚à•s“™•ªŽUƒ‚ƒfƒ‹‚ð“K—p‚·‚邱‚Æ‚ª‚Å‚«‚éB‚±‚ÌꇂÍAƒVƒOƒiƒ‹ŽhŒƒ‚Ì•ªŽU‚ªƒmƒCƒYŽhŒƒ‚Æ“¯‚¶‚P‚Å‚ ‚邯„’肳‚ê‚éB

 

‚Ƃ̒l‚ÍA‚QAFC‰Û‘è‚ðˆÈ‰º‚̂悤‚ÉŠg’£‚·‚邯‹‚߂邱‚Æ‚ª‚Å‚«‚éB

‚QAFC‚Å‚ÍA’ñަŽhŒƒ‘΂̓ƒmƒCƒYAƒVƒOƒiƒ‹„‚ƃƒVƒOƒiƒ‹AƒmƒCƒY„‚Ì2Ží—Þ‚Å‚ ‚éB‚±‚ê‚ÉAƒƒmƒCƒYAƒmƒCƒY„‚ƃƒVƒOƒiƒ‹AƒVƒOƒiƒ‹„‚Ì‚QŽí—Þ‚ð‰Á‚¦‚ÄA‚SŽí—Þ‚ÌŽhŒƒ‘΂ɑ΂µ‚Ä•]’è–@‚ð—p‚¢‚邯AƒVƒOƒiƒ‹ŽhŒƒŠ´Šo‚Ì•½‹Ï’l‚Æ•ªŽU‚Ì„’è‚ðs‚¤‚±‚Æ‚ª‚Å‚«‚éB

‚QAFC‰Û‘è‚Å‚ÍAŠeŽŽs‚É‚¨‚¢‚Ä‚Q‚‚̎hŒƒiŽhŒƒ‘Îj‚ª—^‚¦‚ç‚ê‚éBŠeŽhŒƒ‚Ì’ñަˆÊ’ui‹óŠÔ“IAŽžŠÔ“Ij‚ðƒS1, S2„‚Å•\‚·B‘æ1’ñަˆÊ’u‚ªS1A‘æ‚Q’ñަˆÊ’u‚ªS2‚Å‚ ‚éBƒn, s„i‚ ‚é‚¢‚ÍAn-sj‚ÍA‘æ‚PˆÊ’u‚ɃmƒCƒYŽhŒƒA‘æ‚QˆÊ’u‚ɃVƒOƒiƒ‹ŽhŒƒ‚ª’ñަ‚³‚ꂽ‚±‚Æ‚ð•\‚·B

‘æ‚P’ñަˆÊ’u‚ÌŽhŒƒŠ´Šo‚ðA‘æ‚QŽhŒƒ’ñަˆÊ’u‚ÌŽhŒƒŠ´Šo‚ð‚Å•\‚·B

‘æ‚PŽhŒƒˆÊ’u‚ɑ΂·‚鑿‚QŽhŒƒˆÊ’u‚̃oƒCƒAƒX‚ðb‚Å•\‚·B‚±‚̃oƒCƒAƒX‚ÍPíŒë·‚̂悤‚ÉŠ´Šo‚Ì‚à‚̂Ɣ½‰ž‚Ì‚à‚̗̂¼ŽÒ‚ðŠÜ‚Þ‚à‚̂ł ‚éB

‚±‚̂Ƃ«AˆÈ‰º‚̂悤‚ɂȂéB

 

‚̂Ƃ«A

‚̂Ƃ«A

‚̂Ƃ«A

‚̂Ƃ«A

 

‚¢‚ÜA”»’f‚ªKŒÂ‚̃JƒeƒSƒŠ‚É‚æ‚é•]’è‚ʼnñ“š‚³‚ê‚é‚à‚̂ƂµA”»’f‚̃JƒeƒSƒŠ‹«ŠE‚ðˆÈ‰º‚̂悤‚É‚¨‚­B

 

 

‚±‚̂Ƃ«A

 

 

‚Å‚ ‚ê‚ÎA’ñަŽhŒƒ‘Î<>‚ɑ΂·‚é”»’f‚Í‚ª—^‚¦‚ç‚ê‚邯‚·‚éB‚·‚Ȃ킿A

 

 

‚Å‚ ‚éB

—Ⴆ‚ÎA”»’fƒJƒeƒSƒŠ[”‚ªŒÂ‚̂Ƃ«‚ÍA•]’è”»’f‚͈ȉº‚̂悤‚È‚à‚Ì‚ªl‚¦‚ç‚ê‚éB

 

F@ƒVƒOƒiƒ‹ŽhŒƒ‚ÍŠm‚©‚É‘æ‚PˆÊ’u‚Å‚ ‚éB

F@ƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚PˆÊ’u‚Å‚ ‚éB

F@ƒVƒOƒiƒ‹ŽhŒƒ‚Í‚½‚Ô‚ñ‘æ‚PŽhŒƒ‚Å‚ ‚éB

F@‚í‚©‚ç‚È‚¢^‚Ç‚¿‚ç‚à“¯‚¶‚ÆŽv‚í‚ê‚éB

F@ƒVƒOƒiƒ‹ŽhŒƒ‚Í‚½‚Ô‚ñ‘æ‚QˆÊ’u‚Å‚ ‚éB

F@ƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’u‚Å‚ ‚éB

F@ƒVƒOƒiƒ‹ŽhŒƒ‚ÍŠm‚©‚É‘æ‚QˆÊ’u‚Å‚ ‚éB

 

•½‹ÏA•ªŽU‚̳‹K•ª•z‚Ì—ÝÏ•ª•z‚ð

 

 

‚Å•\‚µAˆÈ‰º‚̂悤‚ɕ֋X“I‚ÉÝ’è‚·‚éB

 

 

‚±‚̂Ƃ«A·‚Ì•ª•z‚͈ȉº‚̂悤‚É—^‚¦‚ç‚ê‚éB

 

 

ŽhŒƒ‘Î ‚ª’ñަ‚³‚ê‚Æ‚«A

 

 

‚µ‚½‚ª‚Á‚ÄA

 

 

ŽhŒƒ‘΂ª’ñަ‚³‚ꂽ‚Æ‚«A

 

 

‚µ‚½‚ª‚Á‚ÄA

 

 

 

ŽhŒƒ‘΂ª’ñަ‚³‚ꂽ‚Æ‚«A

 

 

‚µ‚½‚ª‚Á‚ÄA

 

 

 

ŽhŒƒ‘΂ª’ñަ‚³‚ꂽ‚Æ‚«A

 

 

‚µ‚½‚ª‚Á‚ÄA

 

 

 

‚¢‚ÜAƒJƒeƒSƒŠ‹«ŠE‚ÍAŒ´“_‚ð’†S‚Æ‚µ‚Ä‘ÎÌ‚Éݒ肳‚ê‚Ä‚¢‚邯‚·‚éB

‚µ‚½‚ª‚Á‚ÄAK‚ª‹ô”‚Å‚ ‚ê‚ÎA

 

 

Šï”‚Å‚ ‚ê‚ÎA

 

 

 

ã‚̃‚ƒfƒ‹‚ÉŠî‚¢‚ăxƒCƒY•ªÍ‚·‚邽‚ß‚ÌStanƒXƒNƒŠƒvƒg‚ðAK‚ª‹ô”‚Ìê‡‚ðƒŠƒXƒgD1‚ÉAK‚ªŠï”‚Ìê‡‚ðƒŠƒXƒgD2‚ÉŽ¦‚·B‚±‚ê‚ç‚̃XƒNƒŠƒvƒgƒtƒ@ƒCƒ‹‚ð—p‚¢‚ÄŠg’£‚QAFC•]’è–@‚É‚æ‚éƒf[ƒ^‚ðƒxƒCƒY•ªÍ‚·‚éƒXƒNƒŠƒvƒg‚ðƒŠƒXƒgD3‚ÉŽ¦‚·Bƒtƒ@ƒCƒ‹‚ÍA2AFCfiles.zip‚ɂ܂Ƃ߂½B

 

ƒŠƒXƒgD1‚̃tƒ@ƒCƒ‹iSDT_2AFC_KCat_even.stanjAƒŠƒXƒgD2‚̃tƒ@ƒCƒ‹iSDT_2AFC_KCat_odd.stanjAƒŠƒXƒgD3‚̃tƒ@ƒCƒ‹iAnalEx2AFCR.pyjA‚¨‚æ‚Ñ“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚𓯂¶ƒtƒHƒ‹ƒ_‚É’u‚­B‚±‚̃tƒHƒ‹ƒ_‚ɃJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠiƒtƒHƒ‹ƒ_j‚ðˆÚ‚µ‚ÄAŽŸ‚̃Rƒ}ƒ“ƒh‚ðCmdStanPy‚̃Cƒ“ƒXƒg[ƒ‹‚³‚ꂽŠÂ‹«‚ÅŽÀs‚·‚éBCmdStanPy‚Ì€”õ‚ÌŠÈ’P‚Èà–¾‚ðA‚±‚̃EƒFƒuƒTƒCƒg‚É—pˆÓ‚µ‚½B

 

(stan) *****/sdt_nesgm$ python AnalEx2AFCR.py

 

ã‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚邯Ao—̓tƒ@ƒCƒ‹–¼‚Æ“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚Ìݒ肪‹‚ß‚ç‚ê‚éB

 

(stan) *****/sdt_nesgm$ python AnalEx2AFCR.py

Output file (*.txt) = Results.txt

Input data file (*.xlsx) = Data6Cat.xlsx

 

o—̓tƒ@ƒCƒ‹–¼‚ÍA”CˆÓ‚̃eƒLƒXƒgƒtƒ@ƒCƒ‹–¼iƒtƒ@ƒCƒ‹Šg’£Žq‚ªu.txtvj‚ðÝ’è‚·‚ê‚΂悢B

“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚ÍA}D1‚ÌŒ`Ž®‚ÌExcelƒtƒ@ƒCƒ‹‚Æ‚µ‚Ä—pˆÓ‚·‚éB

 

}D1

 

}D1‚̃f[ƒ^‚ÍA”»’fƒJƒeƒSƒŠ”K‚ª‚UŒÂ‚Ìꇂł ‚éB‘æ‚Ps–Ú‚ÍAŽÀŒ±ðŒ‚ð•\‚µ‚Ä‚¢‚éB‘æ‚Q—ñ–Ú‚ªŽhŒƒ‘Î A‘æ‚R—ñ–Ú‚ªŽhŒƒ‘Î A‘æ‚S—ñ–Ú‚ªŽhŒƒ‘Î A‘æ‚T—ñ–Ú‚ªŽhŒƒ‘Î ‚Å‚ ‚éBŽÀŒ±ðŒ‚ð•\‚·ŽhŒƒ‘΂̇˜‚ÍA‚±‚̇”Ô‚Å“ü—Í‚·‚éB

‘æ‚P—ñ–Ú‚ÍA”»’fƒJƒeƒSƒŠR‚ð•\‚·BƒJƒeƒSƒŠ‚P‚©‚çƒJƒeƒSƒŠKi}D1‚ÌꇂÍAK=7j‚܂ł̔’l‚ҔԂɕ\‚·B”»’fƒJƒeƒSƒŠ‚Ì”’lR‚Æ”»’fi”½‰žj‚ÌŠÖŒW‚ÍA‚±‚̉ӊ‚Ìà–¾‚ðŽQÆ‚³‚ꂽ‚¢B—Ⴆ‚ÎAƒJƒeƒSƒŠ‚PuƒVƒOƒiƒ‹ŽhŒƒ‚ÍŠm‚©‚É‘æ‚PˆÊ’uvAƒJƒeƒSƒŠ‚QuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚PˆÊ’uvAƒJƒeƒSƒŠ‚RuƒVƒOƒiƒ‹ŽhŒƒ‚Í‚½‚Ô‚ñ‘æ‚PˆÊ’uvAƒJƒeƒSƒŠ‚SuƒVƒOƒiƒ‹ŽhŒƒ‚Í‚½‚Ô‚ñ‘æ‚QˆÊ’uvAƒJƒeƒSƒŠ‚TuƒVƒOƒiƒ‹ŽhŒƒ‚Í‘æ‚QˆÊ’uvAƒJƒeƒSƒŠ‚UuƒVƒOƒiƒ‹ŽhŒƒ‚ÍŠm‚©‚É‘æ‚QˆÊ’uv‚ƂȂéB

ŽhŒƒ’ñŽ¦ðŒ‚Æ”»’fƒJƒeƒSƒŠ‚Ì“x”ƒf[ƒ^‚ðAŠY“–‚·‚éƒZƒ‹‚É‘‚«ž‚ñ‚Å‚¢‚­B

 

ƒtƒ@ƒCƒ‹–¼‚ðÝ’è‚·‚邯Aƒtƒ@ƒCƒ‹‚ª“ǂݞ‚Ü‚êAStanƒXƒNƒŠƒvƒg‚ªƒRƒ“ƒpƒCƒ‹‚³‚ê‚éBƒRƒ“ƒpƒCƒ‹‚É‘½­‚ÌŽžŠÔ‚ªŠ|‚©‚邪AƒRƒ“ƒpƒCƒ‹ŒãAMCMCƒTƒ“ƒvƒŠƒ“ƒO‚ªŽn‚Ü‚éBMCMCƒTƒ“ƒvƒŠƒ“ƒO‚ªI—¹‚·‚邯A}D2‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}D2

 

ƒpƒ‰ƒ[ƒ^‚·‚Ȃ킿‚ÌŽ–Œã•ª•z‚̃Oƒ‰ƒt‚Å‚ ‚éB

}D2‚ÌWindow‚ð•‚¶‚邯A}D3‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}D3

 

ƒpƒ‰ƒ[ƒ^‚ÌŽ–Œã•ª•z‚̃Oƒ‰ƒt‚Å‚ ‚éB

}D3‚ÌWindow‚ð•‚¶‚邯A}D4‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}D4

 

”»’fƒJƒeƒSƒŠ‚Ì‹«ŠE’l‚ÌŽ–Œã•ª•z‚̃Oƒ‰ƒt‚Å‚ ‚éB‹«ŠE’lC3‚ÍAƒJƒeƒSƒŠ”‚ª‹ô”‚ÌꇂÍA‰¼’èi‚Uj‚É‚æ‚è’†‰›‚̃JƒeƒSƒŠ‹«ŠE’l‚Í‚O‚ɌŒ肳‚ê‚Ä‚¢‚邱‚Ƃɂæ‚èA‚Œ蔂ł ‚é‚Ì‚ÅAŒ´“_ã‚ÉԂ̬‰~”Õ‚Å•\ަ‚³‚ê‚Ä‚¢‚éB

}D4‚ÌWindow‚ð•‚¶‚邯A}D5‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}D5

 

ƒpƒ‰ƒ[ƒ^b‚ÌŽ–Œã•ª•z‚̃Oƒ‰ƒt‚Å‚ ‚éB

}D5‚ÌWindow‚ð•‚¶‚邯A}D6‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

 

}D6

 

ŠeŽhŒƒ’ñަðŒ‚É‚¨‚¢‚ÄAƒJƒeƒSƒŠ”½‰ž‚ª‚‹‚܂ł̃f[ƒ^‚Ì—Ýϔ䗦Obs(k)‚ÆAƒ‚ƒfƒ‹‚Ì—\‘ª—Ýϔ䗦iŽ–Œã•ª•z‚Ì’†‰›’ljEst(k)‚Ì“_‚ðü•ª‚ÅŒ‹‚ñ‚¾‚à‚̂ł ‚éBƒ‚ƒfƒ‹‚Ì—\‘ª—Ýϔ䗦‚ƃf[ƒ^‚Ì—Ýϔ䗦‚ªˆê’v‚·‚ê‚ÎA‚±‚Ìü•ª‚ÅŒ‹‚ñ‚¾Ü‚êü‚ÍAŒ´“_‚Æ“_i1C1j‚ð’Ê‚éü•ªi•”jüj‚Éd‚È‚éB}‚c‚U‚ÌÜ‚êü‚ÍA‚±‚̑Ίpü‚̋߂­‚É‚ ‚邯Œ¾‚¦‚éB

 

}D6‚ÌWindow‚ð•‚¶‚邯AŽÀsI—¹‚Å‚ ‚éB

’[––‚É‚ÍAŽŸ‚̂悤‚ȃƒbƒZ[ƒW‚ª•\ަ‚³‚ê‚Ä‚¢‚éB

 

 

Results.txt was saved.

 

(stan) *****/sdt_nesgm$

 

 

o—̓tƒ@ƒCƒ‹Results.txt‚ðŠJ‚­‚ÆAˆÈ‰º‚̂悤‚È“à—e‚Å‚ ‚éB

 

               Mean      MCSE        StdDev  ...  ESS_tail  ESS_bulk/s     R_hat

lp__    -299.271000  0.036671  1.577230e+00  ...   2502.58     8454.32  1.000630

mu_s       0.951517  0.003732  1.945770e-01  ...   2505.81    12214.60  0.999686

sgm_s      1.278720  0.003718  1.852620e-01  ...   2526.00    11063.70  1.000690

b         -0.027728  0.001971  1.157970e-01  ...   2459.44    15541.80  1.000130

preC[1]    0.626552  0.000468  2.359620e-02  ...   2664.96    11415.00  1.000610

...             ...       ...           ...  ...       ...         ...       ...

C[5]       2.679530  0.005267  2.676970e-01  ...   2674.99    11517.60  1.000450

vsum       0.726786  0.000394  1.989950e-02  ...   2674.99    11517.60  1.000450

sgm_nn     1.414210       NaN  2.242930e-14  ...       NaN         NaN       NaN

sgm_ns     1.627280  0.002934  1.462370e-01  ...   2526.00    11063.70  1.000690

sgm_ss     1.808380  0.005259  2.620000e-01  ...   2526.00    11063.70  1.000700

 

[68 rows x 11 columns]

 

 

 

 

ƒŠƒXƒgD1 @•]’èƒJƒeƒSƒŠ”‚ª‹ô”‚̂Ƃ«iSDT_2AFC_KCat_even.stanj

 

data {

    int K;

    array[K] int nn_cond;

    array[K] int ns_cond;

    array[K] int sn_cond;

    array[K] int ss_cond;

}

transformed data {

    int hK;

    vector[K/2] alpha;

    hK = K / 2;

    for (i in 1:hK) {

        alpha[i] = 1.0;

    }

}

parameters {

    real mu_s;

    real<lower = 0.0> sgm_s;

    real b;

    simplex[hK] preC;

}

transformed parameters {

    vector[K] nn_theta;

    vector[K] ns_theta;

    vector[K] sn_theta;

    vector[K] ss_theta;

    vector[K+1] nn_cum_p;

    vector[K+1] ns_cum_p;

    vector[K+1] sn_cum_p;

    vector[K+1] ss_cum_p;

    vector[K-1] C;

    real vsum;

    real sgm_nn;

    real sgm_ns;

    real sgm_ss;

 

    C[hK] = 0.0;

    vsum = 0.0;

    for (i in 1:hK-1) {

        vsum += preC[i];

        C[hK+i] = vsum / (1.0 - vsum);

        C[hK-i] = -C[hK+i];

    }

 

    sgm_nn = sqrt(1.0 + 1.0);

    sgm_ns = sqrt(1.0 + square(sgm_s));

    sgm_ss = sqrt(square(sgm_s)*2);

 

    nn_cum_p[1] = 0.0;

    ns_cum_p[1] = 0.0;

    sn_cum_p[1] = 0.0;

    ss_cum_p[1] = 0.0;

    nn_cum_p[K+1] = 1.0;

    ns_cum_p[K+1] = 1.0;

    sn_cum_p[K+1] = 1.0;

    ss_cum_p[K+1] = 1.0;

   

    for (i in 2:K) {

        nn_cum_p[i] = normal_cdf(C[i-1] | b, sgm_nn);

        ns_cum_p[i] = normal_cdf(C[i-1] | mu_s + b, sgm_ns);

        sn_cum_p[i] = normal_cdf(C[i-1] | -mu_s + b, sgm_ns);

        ss_cum_p[i] = normal_cdf(C[i-1] | b, sgm_ss);

    }

 

    for (i in 1:K) {

        nn_theta[i] = nn_cum_p[i+1] - nn_cum_p[i];

        ns_theta[i] = ns_cum_p[i+1] - ns_cum_p[i];

        sn_theta[i] = sn_cum_p[i+1] - sn_cum_p[i];

        ss_theta[i] = ss_cum_p[i+1] - ss_cum_p[i];

    }

}

model {

    mu_s ~ normal(0.0, 1000.0);

    sgm_s ~ exponential(0.001);

    preC ~ dirichlet(alpha);

    b ~ normal(0.0, 1000.0);

    nn_cond ~ multinomial(nn_theta);

    ns_cond ~ multinomial(ns_theta);

    sn_cond ~ multinomial(sn_theta);

    ss_cond ~ multinomial(ss_theta);

}

 

 

 

 

ƒŠƒXƒgD2@•]’èƒJƒeƒSƒŠ”‚ªŠï”‚̂Ƃ«iSDT_2AFC_KCat_odd.stanj

 

data {

    int K;

    array[K] int nn_cond;

    array[K] int ns_cond;

    array[K] int sn_cond;

    array[K] int ss_cond;

}

transformed data {

    int hK;

    vector[(K/2)+1] alpha;

    hK = K / 2;

    for (i in 1:hK+1) {

        alpha[i] = 1.0;

    }

}

parameters {

    real mu_s;

    real<lower = 0.0> sgm_s;

    real b;

    simplex[hK+1] preC;

}

transformed parameters {

    vector[K] nn_theta;

    vector[K] ns_theta;

    vector[K] sn_theta;

    vector[K] ss_theta;

    vector[K+1] nn_cum_p;

    vector[K+1] ns_cum_p;

    vector[K+1] sn_cum_p;

    vector[K+1] ss_cum_p;

    vector[K-1] C;

    real vsum;

    real sgm_nn;

    real sgm_ns;

    real sgm_ss;

 

    vsum = 0.0;

    for (i in 1:hK) {

        vsum += preC[i];

        C[hK+i] = vsum / (1.0 - vsum);

        C[hK+1-i] = -C[hK+i];

    }

 

    sgm_nn = sqrt(1.0 + 1.0);

    sgm_ns = sqrt(1.0 + square(sgm_s));

    sgm_ss = sqrt(square(sgm_s)*2);

 

    nn_cum_p[1] = 0.0;

    ns_cum_p[1] = 0.0;

    sn_cum_p[1] = 0.0;

    ss_cum_p[1] = 0.0;

    nn_cum_p[K+1] = 1.0;

    ns_cum_p[K+1] = 1.0;

    sn_cum_p[K+1] = 1.0;

    ss_cum_p[K+1] = 1.0;

   

    for (i in 2:K) {

        nn_cum_p[i] = normal_cdf(C[i-1] | b, sgm_nn);

        ns_cum_p[i] = normal_cdf(C[i-1] | mu_s + b, sgm_ns);

        sn_cum_p[i] = normal_cdf(C[i-1] | -mu_s + b, sgm_ns);

        ss_cum_p[i] = normal_cdf(C[i-1] | b, sgm_ss);

    }

 

    for (i in 1:K) {

        nn_theta[i] = nn_cum_p[i+1] - nn_cum_p[i];

        ns_theta[i] = ns_cum_p[i+1] - ns_cum_p[i];

        sn_theta[i] = sn_cum_p[i+1] - sn_cum_p[i];

        ss_theta[i] = ss_cum_p[i+1] - ss_cum_p[i];

    }

}

model {

    mu_s ~ normal(0.0, 1000.0);

    sgm_s ~ exponential(0.001);

    preC ~ dirichlet(alpha);

    b ~ normal(0.0, 1000.0);

    nn_cond ~ multinomial(nn_theta);

    ns_cond ~ multinomial(ns_theta);

    sn_cond ~ multinomial(sn_theta);

    ss_cond ~ multinomial(ss_theta);

}

 

 

 

 

ƒŠƒXƒgD3@ƒŠƒXƒgD1‚̃XƒNƒŠƒvƒg‚ÆƒŠƒXƒgD2‚̃XƒNƒŠƒvƒg‚ð—p‚¢‚éPythonƒXƒNƒŠƒvƒgiAnalEx2AFCR.pyj

 

from cmdstanpy import CmdStanModel

import pandas as pd

import numpy as np

import scipy.stats as ss

import matplotlib.pyplot as plt

import seaborn as sb

 

 

outflnm = input('Output file (*.txt) = ') 

fout = open(outflnm, 'w')

 

inflnm = input('Input data file (*.xlsx) = ')

df_raw = pd.read_excel(inflnm)

print(df_raw)

data = np.array(df_raw.values)

print(data)

K = len(data)

print('K =', K)

n_n = data.T[1]

n_s = data.T[2]

s_n = data.T[3]

s_s = data.T[4]

 

print('n_n =', n_n)

print('n_s =', n_s)

print('s_n =', s_n)

print('s_s =', s_s)

 

model = CmdStanModel(stan_file = 'SDT_2AFC_KCat_odd.stan' if K % 2 == 1 else

                     'SDT_2AFC_KCat_even.stan')

 

Data = {'K':K, 'nn_cond':n_n, 'ns_cond':n_s, 'sn_cond':s_n, 'ss_cond':s_s}

fit = model.sample(data=Data) 

 

print(fit.summary())

fout.write(f'\n{fit.summary()}\n')

 

fit = fit.draws_pd()

 

mu_s_med = np.median(fit['mu_s'])

sb.kdeplot(fit['mu_s'])

plt.xlabel(r'$\mu_s$')

plt.title(r'$\mu_s$(Med) = {0:.3f}'.format(mu_s_med))

plt.show()

 

sgm_s_med = np.median(fit['sgm_s'])

sb.kdeplot(fit['sgm_s'])

plt.title(r'$\sigma_s$(Med) = {0:.3f}'.format(sgm_s_med))

plt.xlabel(r'$\sigma_s$')

plt.show()

 

C = []

for k in range(K-1):

    C.append(fit[f'C[{k+1}]'])

C = np.array(C).T

 

s_title = ''

if K % 2 == 1:

    for k in range(K-1):

        sb.kdeplot(C.T[k]) 

        c_med = np.median(C.T[k])

        s_title += f'C{k+1}={c_med:.2f}'

        if k < K-2:

            s_title += ', '

   

else:

    for k in range(K-1):

        if k != (K//2) - 1:

            sb.kdeplot(C.T[k])  #fit['C'].T[k])

            c_med = np.median(C.T[k])

            s_title += f'C{k+1}={c_med:.2f}'

            if k < K-2:

                s_title += ', '

        else:

            plt.plot([0], [0], marker = 'o', markersize = 15, c = 'r')

            s_title += f'C{k+1}=0, '

           

plt.title('Med. estimates\n' + s_title)

plt.show()

 

b_med = np.median(fit['b'])

sb.kdeplot(fit['b'])

plt.title('b(Med) = {0:.3f}'.format(b_med))

plt.show()

 

cum_n_n = np.cumsum(n_n)

pcum_n_n = cum_n_n/cum_n_n[-1]

cum_n_s = np.cumsum(n_s)

pcum_n_s = cum_n_s / cum_n_s[-1]

cum_s_n = np.cumsum(s_n)

pcum_s_n = cum_s_n / cum_s_n[-1]

cum_s_s = np.cumsum(s_s)

pcum_s_s = cum_s_s / cum_s_s[-1]

 

fit_nn_cum_p = []

fit_ns_cum_p = []

fit_sn_cum_p = []

fit_ss_cum_p = []

for k in range(K+1):

    fit_nn_cum_p.append(fit[f'nn_cum_p[{k+1}]'])

    fit_ns_cum_p.append(fit[f'ns_cum_p[{k+1}]'])

    fit_sn_cum_p.append(fit[f'sn_cum_p[{k+1}]'])

    fit_ss_cum_p.append(fit[f'ss_cum_p[{k+1}]'])

fit_nn_cum_p = np.array(fit_nn_cum_p).T

fit_ns_cum_p = np.array(fit_ns_cum_p).T

fit_sn_cum_p = np.array(fit_sn_cum_p).T

fit_ss_cum_p = np.array(fit_ss_cum_p).T

                       

est_pcum_n_n = np.median(fit_nn_cum_p, axis = 0)[1:-1]

est_pcum_n_s = np.median(fit_ns_cum_p, axis = 0)[1:-1]

est_pcum_s_n = np.median(fit_sn_cum_p, axis = 0)[1:-1]

est_pcum_s_s = np.median(fit_ss_cum_p, axis = 0)[1:-1]

 

plt.plot(est_pcum_n_n, pcum_n_n[:-1], label = 'n_n')

plt.plot(est_pcum_n_s, pcum_n_s[:-1], label = 'n_s')

plt.plot(est_pcum_s_n, pcum_s_n[:-1], label = 's_n')

plt.plot(est_pcum_s_s, pcum_s_s[:-1], label = 's_s')

plt.plot([0,1], [0,1], c = 'k', ls = '--', label = 'Obs.=Est.')

plt.xlabel('Est.Cum.P')

plt.ylabel('Obs.Cum.P')

plt.legend()

plt.title('Cumulative Proportions')

plt.show()

 

fout.close()

print('\n', outflnm, 'was saved.\n')

 

 

 

ŽQl•¶Œ£

Brady,T.F, Robinson,M.M., Williams,J.R., & Wixted,J.T. (2023). easuring memory is harder than you think: How to avoid problematic measurement practices in memory research.  Psychonomic Bulletin & Review, 30, 421449.

‰ª–{ˆÀ°i2019j‚¢‚Ü‚³‚ç•·‚¯‚È‚¢Python‚Ńf[ƒ^•ªÍDŠÛ‘Po”Å

Okamoto, Y. (2023) Extended 2AFC Rating Task. OSF. from https://osf.io/ts2eq/

‰ª–{ˆÀ°i2025jŠ´ŠoE’mŠo‘ª’è–@D˜aŸ†“T“ñEd–ìƒE‘ºãˆè–çi•ÒjŠ´ŠoE’mŠoS—Šwƒnƒ“ƒhƒuƒbƒN ‘æŽO”Åi‘æ2ÍjA½M‘–[

 

 

 

Home