‚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 |
|
ƒ |
Œë”½‰ž |
³”½‰ž |
|
ƒ |
³”½‰ž |
Œë”½‰ž |
@‚¢‚Ü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
‚ð‹‚߂邱‚Æ‚ª‚Å‚«‚È‚¢Bu
v‚̉¼’èi“™•ªŽUƒ‚ƒfƒ‹j‚Ì‚à‚Æ‚ÅA•ªÍ‚ªs‚í‚ê‚éB•\‚P‚̃fƒUƒCƒ“‚̉º‚Å•]’è–@‚ð—p‚¢‚邱‚Æ‚ª‚Å‚«‚éi‰ª–{A2025jBu
v‚̉¼’è‚ð’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 |
|
ƒ |
|
EEE |
|
EEE |
|
|
ƒ |
|
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ƒ‹i
j‚ ‚é‚¢‚Í‚æ‚èˆê”Ê“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‚Ü‚¸
i
j‚ÌŽ–Œã•ª•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))
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
![]()
Šï”‚Å‚ ‚ê‚Î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')
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, 421–449.
‰ª–{ˆÀ°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‘–[