‚Q‘I‘ðŽˆ‹§–@3‘ΔÅ
Two Alternative Forced Choice (2AFC)
Rating Method with Tri-Pair
ƒVƒOƒiƒ‹ŽhŒƒŠ´Šo‚Ì•ªŽUi•W€•ηj‚Ì„’è
Brady‚çi2023j‚ÍA‹L‰¯‚̃pƒtƒH[ƒ}ƒ“ƒX‚ÌŒ¤‹†‚É‚¨‚¢‚Ă͂QAFC‚ð—p‚¢‚邱‚Æ‚ð„§‚µ‚Ä‚¢‚邪A‚³‚ç‚ÉA•s“™•ªŽUƒ‚ƒfƒ‹‚ªROC‹Èü‚ɂ悇‚¤‚Æà–¾‚µ‚Ä‚¢‚éip. 442jBDecarlo(2010)‚ÍA•s“™•ªŽUƒ‚ƒfƒ‹‚ÍAL‚—p‚¢‚ç‚ê‚Ä‚¢‚é‚Æà–¾‚µ‚Ä‚¢‚éB
•W€“I‚È‚QAFC‰Û‘è‚ł͓™•ªŽUƒ‚ƒfƒ‹‚ª‰¼’肳‚ê‚Ä‚¢‚邪A2AFC‚ðŠ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‚Å‚ ‚邯‚¢‚¤•ªÍŒ‹‰Ê‚ª—\‘z‚³‚ê‚éB
Okamoto(2023)‚Å‚ÍA’ñަŽhŒƒ‘΂ÍA•W€2AFC‚̃n,s„‚ƃs,n„‚ɉÁ‚¦‚ÄAƒVƒOƒiƒ‹ŽhŒƒ‚Ì•ªŽU‚ð„’è‚·‚邽‚߂Ƀn,n„‚ƃs,s„‚Ì‚Q‘΂ª‰Á‚¦‚ç‚ê‚Ä‚¢‚éB‚µ‚©‚µAƒs,s„‚𜂢‚½‚R‘΂łàƒpƒ‰ƒ[ƒ^‚Ì„’肪‰Â”\‚Å‚ ‚é‚Ì‚ÅA‚±‚±‚Å‚ÍAƒn,n„Aƒn,s„Aƒs,n„‚Ì‚R‘΂ð—p‚¢‚½ê‡‚ɂ‚¢‚Äà–¾‚·‚éB
‚Ü‚¸Aƒ‚ƒfƒ‹‚ɂ‚¢‚Äà–¾‚ðs‚¢A‚»‚ÌŒãA•ªÍ—á‚ðŽ¦‚·Bƒtƒ@ƒCƒ‹‚ÍAtripfiles.zip‚ɂ܂Ƃ߂½B
ƒ‚ƒfƒ‹
ƒmƒCƒYŽhŒƒ
‚ÌŠ´Šo‚ð
‚ÅAƒVƒOƒiƒ‹ŽhŒƒ
‚ÌŠ´Šo‚ð
‚Å•\‚µA‚»‚ꂼ‚ꎟ‚̳‹K•ª•z‚É]‚¤‚Æ‚·‚éB
![]()
![]()
‚±‚±‚ÅAŠ´ŠoŽŸŒ³‚ÌŒ´“_‚Æ’PˆÊ‚ðƒmƒCƒYŽhŒƒ‚ÌŠ´Šo‚Ì•½‹Ï’l‚Æ•W€•ηi•ªŽU‚Ì•½•ûªj‚ªŽŸŽ®‚ð–ž‚½‚·‚悤‚ÉÝ’è‚·‚éiWickens, 2002jB
![]()
ŒŸo—Í‚ÍAƒVƒOƒiƒ‹ŽhŒƒŠ´Šo‚Ì•½‹Ï’l
‚ƃmƒCƒYŽhŒƒŠ´Šo‚Ì•½‹Ï’l
‚Ì·‚Å•\‚³‚ê‚éiGreen & Swets, 1988jB
![]()
‚Å‚ ‚éB
ƒVƒOƒiƒ‹ŽhŒƒŠ´Šo‚Ì•ªŽU‚ªƒmƒCƒYŽhŒƒŠ´Šo‚Ì•ªŽU‚Æ“™‚µ‚¢‚Æ‚«A‚·‚Ȃ킿A
![]()
‚̂Ƃ«‚ÍAŒŸo—Í‚Í
‚Å•\‚³‚ê‚éB‚·‚Ȃ킿A
![]()
‚Å‚ ‚é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„‚ð‰Á‚¦‚ÄA‚RŽí—Þ‚ÌŽ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
![]()
‚¢‚ÜAƒJƒeƒSƒŠ‹«ŠE‚ªAŒ´“_‚ð’†S‚Æ‚µ‚Ä‘ÎÌ‚Éݒ肳‚ê‚Ä‚¢‚邯‚·‚éBƒoƒCƒAƒXƒpƒ‰ƒ[ƒ^
‚ÌŽg—p‚É‚æ‚èAƒJƒeƒSƒŠ‹«ŠE‚ÍŒ´“_‚ð’†S‚Æ‚µ‚Äݒ肳‚ê‚Ä‚¢‚邯l‚¦‚邱‚Æ‚ª‚Å‚«‚éB
‚µ‚½‚ª‚Á‚ÄAK‚ª‹ô”‚Å‚ ‚ê‚ÎA
![]()
Šï”‚Å‚ ‚ê‚ÎA
![]()
ã‹L‚̃‚ƒfƒ‹‚ÌStanƒXƒNƒŠƒvƒg‚ðA
‚ª‹ô”‚Ìê‡‚ðƒŠƒXƒg‚P‚ÉA
‚ªŠï”‚Ìê‡‚ðƒŠƒXƒg‚Q‚ÉŽ¦‚·BƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹‚ÍAtripfiles.zip‚ɂ܂Ƃ߂½B
‚±‚ê‚ç‚̃XƒNƒŠƒvƒg‚ð—p‚¢‚½•ªÍ—á‚ðŽŸ‚ÉŽ¦‚·B
ƒJƒeƒSƒŠ”‚ª‹ô”‚ÌꇂƊÌꇂɕª‚¯‚ÄŽ¦‚·B
ƒŠƒXƒg‚P‚ÌStanƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹‚ÆAƒŠƒXƒg‚P‚ðŽg—p‚·‚éPythonƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹iƒŠƒXƒg3jA‚¨‚æ‚Ñ“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚𓯂¶ƒtƒHƒ‹ƒ_‚É’u‚B‚»‚̃tƒHƒ‹ƒ_‚ɃJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ðˆÚ‚µ‚ÄACmdStanPy‚̃Cƒ“ƒXƒg[ƒ‹‚³‚ꂽŠÂ‹«‚ÅAŽŸ‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚éBCmdStanPy‚̃Cƒ“ƒXƒg[ƒ‹‚ɂ‚¢‚Ä‚ÍA‚±‚̃EƒFƒuƒTƒCƒgA‚ ‚é‚¢‚Í‚±‚̃EƒFƒuƒTƒCƒg‚ȂǂðŽQÆ‚³‚ꂽ‚¢B
(stan) ****/evencatfiles$ python AnalTriP2AFCReven.py
ã‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚邯A“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚ð•·‚¢‚Ä‚‚éB
(stan) ****/evencatfiles$
python AnalTriP2AFCReven.py
Input data file (*.xlsx) =
tripeven100.xlsx
ã‚Ì—á‚Å‚ÍAƒtƒ@ƒCƒ‹–¼tripeven100.xlsx‚ªÝ’肳‚ê‚Ä‚¢‚éB
}A1‚ÉAƒtƒ@ƒCƒ‹tripeven100.xlsx‚ðExcel‚ÅŠJ‚¢‚½‚à‚Ì‚ðŽ¦‚·B

}A1@Excelƒtƒ@ƒCƒ‹tripeven100.xlsx
ƒJƒeƒSƒŠ”
‚ªK=4‚Ì‹ô”‚Ìꇂ̃f[ƒ^—á‚Å‚ ‚éB
‚Ps–Ú‚ÉA•Ï”–¼‚ª’u‚©‚ê‚Ä‚¢‚éB‚P—ñ–Ú‚ÍA”»’fƒJƒeƒSƒŠ‚ð•\‚µA‚P‚©‚ç‚S‚܂ł̔»’fƒJƒeƒSƒŠ‚ð•\‚·®”’l‚ª¸‡‚É’u‚©‚ê‚Ä‚¢‚éB‚Q—ñ–Ú‚ÍAŽhŒƒ‘΃ƒmƒCƒYŽhŒƒAƒmƒCƒYŽhŒƒ„‚ɑ΂·‚é•p“x‚Å‚ ‚éB‚R—ñ–ڂɃƒmƒCƒYŽhŒƒAƒVƒOƒiƒ‹ŽhŒƒ„‚ɑ΂·‚é•p“xA‚S—ñ–ڂɃƒVƒOƒiƒ‹ŽhŒƒAƒmƒCƒYŽhŒƒ„‚ɑ΂·‚é•p“x‚ªÝ’肳‚ê‚Ä‚¢‚éB”»’fƒJƒeƒSƒŠ”‚ª‚j‚̂Ƃ«‚ÍA}‚`‚P‚Í‚P{‚js‚̃tƒH[ƒ}ƒbƒg‚ɂȂéB
“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚ðÝ’è‚·‚邯AStanƒXƒNƒŠƒvƒg‚̃rƒ‹ƒh‚ªŽn‚Ü‚éBMCMCƒTƒ“ƒvƒŠƒ“ƒO‚ªI—¹‚·‚邯AƒgƒŒ[ƒX}‚ª•\ަ‚³‚ê‚éi}A2jB

}A2
‰E‘¤‚ÉŠeƒTƒ“ƒvƒŠƒ“ƒO‚̃gƒŒ[ƒX‚ª•\ަ‚³‚êA¶‘¤‚ɃTƒ“ƒvƒŠƒ“ƒO‚ÌŽ–Œã•ª•z‚ª•\ަ‚³‚ê‚Ä‚¢‚éB
}A2‚ÌWindow‚ð•‚¶‚邯A}A3‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}A3
ƒpƒ‰ƒ[ƒ^
‚·‚Ȃ킿
‚ÌŽ–Œã•ª•z‚Å‚ ‚éBƒ^ƒCƒgƒ‹—“‚ÉA‘æ1Žl•ªˆÊ”A’†‰›’li‘æ‚QŽl•ªˆÊ”jA‘æ‚RŽl•ªˆÊ”‚ª•\ަ‚³‚ê‚Ä‚¢‚éB
}A3‚ÌWindow‚ð•‚¶‚邯A}A4‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}A4
ƒVƒOƒiƒ‹ŽhŒƒŠ´Šo‚Ì•W€•η
‚ÌŽ–Œã•ª•z‚̃Oƒ‰ƒt‚Å‚ ‚éBƒ^ƒCƒgƒ‹—“‚ÉA‘æ‚PŽl•ªˆÊ”A’†‰›’li‘æ‚QŽl•ªˆÊ”jA‘æ‚RŽl•ªˆÊ”‚ª•\ަ‚³‚ê‚Ä‚¢‚éB
}A4‚ÌWindow‚ð•‚¶‚邯A}A5‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}A5
”»’f‚̃JƒeƒSƒŠ‹«ŠE’l‚ÌŽ–Œã•ª•z‚Å‚ ‚éBƒ^ƒCƒgƒ‹—“‚É‚ÍA‚»‚ꂼ‚ê‚Ì’†‰›’l‚ª•\ަ‚³‚ê‚Ä‚¢‚éBƒJƒeƒSƒŠ”‚ª‚S‚Ìê‡AƒJƒeƒSƒŠ‹«ŠE‚ÍC1AC2AC3‚Ì‚R“_‚Å‚ ‚邪A§–ñi‚Uj‚É‚æ‚èA
‚Ȃ̂Œ蔂ł ‚éBC2‚ª’蔂O‚Å‚ ‚邱‚Æ‚ðA}A5‚Å‚ÍÔF‚Ì”¼‰~‚ÅŽ¦‚µ‚Ä‚¢‚éB
}A5‚ÌWindow‚ð•‚¶‚邯A}A6‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}A6
ƒoƒCƒAƒXƒpƒ‰ƒ[ƒ^
‚ÌŽ–Œã•ª•z‚Å‚ ‚éB‘æ‚PŽl•ªˆÊ”
‚Æ‘æ‚RŽl•ªˆÊ”
‚ÌŠÔ‚É‚O‚ª‚ ‚é‚Ì‚ÅAƒoƒCƒAƒX
‚Å‚ ‚邯l‚¦‚Ă悢‚ÆŽv‚í‚ê‚éB
}A6‚ÌWindow‚ð•‚¶‚邯A}A7‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}A7
’ñަŽhŒƒ‘Εʂ̔»’fƒJƒeƒSƒŠ[‚̔䗦ƒf[ƒ^‚ƃ‚ƒfƒ‹‚É‚æ‚é—\‘ªŠm—¦‚̃Oƒ‰ƒt‚Å‚ ‚éB—\‘ªŠm—¦‚ÍAMCMCƒTƒ“ƒvƒŠƒ“ƒO‚É‚æ‚鎖Œã•ª•z‚Ì’†‰›’l‚Å‚ ‚éBƒf[ƒ^‚Ì•û‚̓‰ƒ“ƒ_ƒ€‚ȕϓ®‚ªŒ©‚ç‚ê‚邪Aƒ‚ƒfƒ‹‚É‚æ‚é—\‘ª’l‚ÍAŽ–Œã•ª•z‚Ì’†‰›’l‚ðÌ—p‚µ‚Ä‚¢‚é‚̂ŃTƒ“ƒvƒŠƒ“ƒO‚ɑ΂µ‚ĈÀ’肵‚Ä‚¢‚邯l‚¦‚ç‚ê‚éB}A7‚̃Oƒ‰ƒt‚©‚çAƒf[ƒ^‚ɑ΂µ‚ă‚ƒfƒ‹‚Í“K‡‚µ‚Ä‚¢‚邯l‚¦‚ç‚ê‚éB
}A‚V‚ÌWindow‚ð•‚¶‚邯A}A8‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}A‚W
ŽhŒƒ‘΂²‚Ƃ̃JƒeƒSƒŠ—Ýϔ䗦‚ðAƒ‚ƒfƒ‹—\‘ª’l‚ɑ΂µ‚ăf[ƒ^‚Ì’l‚̃Oƒ‰ƒt‚ð•`‚¢‚½‚à‚̂ł ‚éB”jü‚ÍAƒ‚ƒfƒ‹—\‘ª’l‚ªƒf[ƒ^‚ƈê’v‚·‚éꇂ̃Oƒ‰ƒt‚Å‚ ‚éBƒ‚ƒfƒ‹—\‘ª’l‚ÍAŽ–Œã•ª•z‚Ì’†‰›’l‚ðƒpƒ‰ƒ[ƒ^’l‚Æ‚µ‚Ä‹‚ß‚ç‚ê‚Ä‚¢‚éBƒ‚ƒfƒ‹—\‘ª’l‚̃Oƒ‰ƒt‚Í”jü‚ɂ悇‚Á‚Ä‚¢‚é‚Ì‚ÅAƒ‚ƒfƒ‹‚̓f[ƒ^‚É“K‡‚µ‚Ä‚¢‚邯l‚¦‚ç‚ê‚éB
}A‚W‚ÌWindow‚ð•‚¶‚邯AƒXƒNƒŠƒvƒg‚ÌŽÀsI—¹‚Å‚ ‚éB’[––‚ÉMCMCƒTƒ“ƒvƒ‹‚Ì“Œv—ʂȂǂª•\ަ‚³‚ê‚Ä‚¢‚邪AuNANv‚Ȃǂ̒l‚̓pƒ‰ƒ[ƒ^‚ɒ蔂ªÝ’肳‚ê‚Ä‚¢‚é‚à‚Ì‚ª‚ ‚邱‚Ƃɂæ‚éB
ƒŠƒXƒg‚Q‚ÌStanƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹‚ÆAƒŠƒXƒg‚Q‚ðŽg—p‚·‚éPythonƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹iƒŠƒXƒg‚SjA‚¨‚æ‚Ñ“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹‚𓯂¶ƒtƒHƒ‹ƒ_‚É’u‚B‚»‚̃tƒHƒ‹ƒ_‚ɃJƒŒƒ“ƒgƒfƒBƒŒƒNƒgƒŠ‚ðˆÚ‚µ‚ÄACmdStanPy‚̃Cƒ“ƒXƒg[ƒ‹‚³‚ꂽŠÂ‹«‚ÅAŽŸ‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚éBCmdStanPy‚̃Cƒ“ƒXƒg[ƒ‹‚ɂ‚¢‚Ä‚ÍA‚±‚̃EƒFƒuƒTƒCƒgA‚ ‚é‚¢‚Í‚±‚̃EƒFƒuƒTƒCƒg‚ȂǂðŽQÆ‚³‚ꂽ‚¢B
(stan) ****/oddcatfiles$ python AnalTriP2AFCRodd.py
ã‚̃Rƒ}ƒ“ƒh‚ðŽÀs‚·‚邯A“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚ð•·‚¢‚Ä‚‚éB
(stan) ****/oddcatfiles$
python AnalTriP2AFCRodd.py
Input data file (*.xlsx) =
tripodd100.xlsx
ã‚Ì—á‚Å‚ÍAƒtƒ@ƒCƒ‹–¼tripodd100.xlsx‚ªÝ’肳‚ê‚Ä‚¢‚éB
}B1‚ÉAƒtƒ@ƒCƒ‹tripodd100.xlsx‚ðExcel‚ÅŠJ‚¢‚½‚à‚Ì‚ðŽ¦‚·B

}B1@Excelƒtƒ@ƒCƒ‹tripodd100.xlsx
ƒJƒeƒSƒŠ”
‚ªK=5‚̊Ìꇂ̃f[ƒ^—á‚Å‚ ‚éB
‚Ps–Ú‚ÉA•Ï”–¼‚ª’u‚©‚ê‚Ä‚¢‚éB‚P—ñ–Ú‚ÍA”»’fƒJƒeƒSƒŠ‚ð•\‚µA‚P‚©‚ç‚T‚܂ł̔»’fƒJƒeƒSƒŠ‚ð•\‚·®”’l‚ª¸‡‚É’u‚©‚ê‚Ä‚¢‚éB‚Q—ñ–Ú‚ÍAŽhŒƒ‘΃ƒmƒCƒYŽhŒƒAƒmƒCƒYŽhŒƒ„‚ɑ΂·‚é•p“x‚Å‚ ‚éB‚R—ñ–ڂɃƒmƒCƒYŽhŒƒAƒVƒOƒiƒ‹ŽhŒƒ„‚ɑ΂·‚é•p“xA‚S—ñ–ڂɃƒVƒOƒiƒ‹ŽhŒƒAƒmƒCƒYŽhŒƒ„‚ɑ΂·‚é•p“x‚ªÝ’肳‚ê‚Ä‚¢‚éB”»’fƒJƒeƒSƒŠ”‚ª‚j‚̂Ƃ«‚ÍA}B‚P‚Í‚P{‚js‚̃tƒH[ƒ}ƒbƒg‚ɂȂéB
“ü—̓f[ƒ^ƒtƒ@ƒCƒ‹–¼‚ðÝ’è‚·‚邯AStanƒXƒNƒŠƒvƒg‚̃rƒ‹ƒh‚ªŽn‚Ü‚éBMCMCƒTƒ“ƒvƒŠƒ“ƒO‚ªI—¹‚·‚邯AƒgƒŒ[ƒX}‚ª•\ަ‚³‚ê‚éi}B2jB

}B2
‰E‘¤‚ÉŠeƒTƒ“ƒvƒŠƒ“ƒO‚̃gƒŒ[ƒX‚ª•\ަ‚³‚êA¶‘¤‚ɃTƒ“ƒvƒŠƒ“ƒO‚ÌŽ–Œã•ª•z‚ª•\ަ‚³‚ê‚Ä‚¢‚éB
}B2‚ÌWindow‚ð•‚¶‚邯A}B3‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}B3
ƒpƒ‰ƒ[ƒ^
‚·‚Ȃ킿
‚ÌŽ–Œã•ª•z‚Å‚ ‚éBƒ^ƒCƒgƒ‹—“‚ÉA‘æ1Žl•ªˆÊ”A’†‰›’li‘æ‚QŽl•ªˆÊ”jA‘æ‚RŽl•ªˆÊ”‚ª•\ަ‚³‚ê‚Ä‚¢‚éB
}B3‚ÌWindow‚ð•‚¶‚邯A}B4‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}B4
ƒVƒOƒiƒ‹ŽhŒƒŠ´Šo‚Ì•W€•η
‚ÌŽ–Œã•ª•z‚̃Oƒ‰ƒt‚Å‚ ‚éBƒ^ƒCƒgƒ‹—“‚ÉA‘æ‚PŽl•ªˆÊ”A’†‰›’li‘æ‚QŽl•ªˆÊ”jA‘æ‚RŽl•ªˆÊ”‚ª•\ަ‚³‚ê‚Ä‚¢‚éB
}B4‚ÌWindow‚ð•‚¶‚邯A}B5‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}B5
”»’f‚̃JƒeƒSƒŠ‹«ŠE’l‚ÌŽ–Œã•ª•z‚Å‚ ‚éBƒ^ƒCƒgƒ‹—“‚É‚ÍA‚»‚ꂼ‚ê‚Ì’†‰›’l‚ª•\ަ‚³‚ê‚Ä‚¢‚éB
}B5‚ÌWindow‚ð•‚¶‚邯A}B6‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}B6
ƒoƒCƒAƒXƒpƒ‰ƒ[ƒ^
‚ÌŽ–Œã•ª•z‚Å‚ ‚éB‘æ‚PŽl•ªˆÊ”
‚Æ‘æ‚RŽl•ªˆÊ”
‚ÌŠÔ‚Ì‹æŠÔ‚̉E’[‚É‚O‚ª‚ ‚éB•‰‚̃oƒCƒAƒX‚ªŽ¦´‚³‚ê‚Ä‚¢‚éB
}B6‚ÌWindow‚ð•‚¶‚邯A}B7‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}B7
’ñަŽhŒƒ‘Εʂ̔»’fƒJƒeƒSƒŠ[‚̔䗦ƒf[ƒ^‚ƃ‚ƒfƒ‹‚É‚æ‚é—\‘ªŠm—¦‚̃Oƒ‰ƒt‚Å‚ ‚éB—\‘ªŠm—¦‚ÍAMCMCƒTƒ“ƒvƒŠƒ“ƒO‚É‚æ‚鎖Œã•ª•z‚Ì’†‰›’l‚Å‚ ‚éBƒf[ƒ^‚Ì•û‚̓‰ƒ“ƒ_ƒ€‚ȕϓ®‚ªŒ©‚ç‚ê‚邪Aƒ‚ƒfƒ‹‚É‚æ‚é—\‘ª’l‚ÍAŽ–Œã•ª•z‚Ì’†‰›’l‚ðÌ—p‚µ‚Ä‚¢‚é‚̂ŃTƒ“ƒvƒŠƒ“ƒO‚ɑ΂µ‚ĈÀ’肵‚Ä‚¢‚邯l‚¦‚ç‚ê‚éB}B7‚̃Oƒ‰ƒt‚©‚çAƒf[ƒ^‚ɑ΂µ‚ă‚ƒfƒ‹‚Í“K‡‚µ‚Ä‚¢‚邯l‚¦‚ç‚ê‚éB
}B‚V‚ÌWindow‚ð•‚¶‚邯A}B8‚̃Oƒ‰ƒt‚ª•\ަ‚³‚ê‚éB

}B‚W
ŽhŒƒ‘΂²‚Ƃ̃JƒeƒSƒŠ—Ýϔ䗦‚ðAƒ‚ƒfƒ‹—\‘ª’l‚ɑ΂µ‚ăf[ƒ^‚Ì’l‚̃Oƒ‰ƒt‚ð•`‚¢‚½‚à‚̂ł ‚éB”jü‚ÍAƒ‚ƒfƒ‹—\‘ª’l‚ªƒf[ƒ^‚ƈê’v‚·‚éꇂ̃Oƒ‰ƒt‚Å‚ ‚éBƒ‚ƒfƒ‹—\‘ª’l‚ÍAŽ–Œã•ª•z‚Ì’†‰›’l‚ðƒpƒ‰ƒ[ƒ^’l‚Æ‚µ‚Ä‹‚ß‚ç‚ê‚Ä‚¢‚éBƒ‚ƒfƒ‹—\‘ª’l‚̃Oƒ‰ƒt‚Í”jü‚ɂ悇‚Á‚Ä‚¢‚é‚Ì‚ÅAƒ‚ƒfƒ‹‚̓f[ƒ^‚É“K‡‚µ‚Ä‚¢‚邯l‚¦‚ç‚ê‚éB
}B‚W‚ÌWindow‚ð•‚¶‚邯AƒXƒNƒŠƒvƒg‚ÌŽÀsI—¹‚Å‚ ‚éB’[––‚ÉMCMCƒTƒ“ƒvƒ‹‚Ì“Œv—ʂȂǂª•\ަ‚³‚ê‚Ä‚¢‚邪AuNANv‚Ȃǂ̒l‚̓pƒ‰ƒ[ƒ^‚ɒ蔂ªÝ’肳‚ê‚Ä‚¢‚é‚à‚Ì‚ª‚ ‚邱‚Ƃɂæ‚éB
Brady, T. F., Robinson, M. M., Williams, J. R., & Wixted, J. T. (2023). Measuring memory is harder than you think: How to avoid problematic measurement practices in memory research. Psychonomic Bulletin & Review, 30, 421-449.
DeCarlo, L. T. (2010). On the statistical and theoretical basis of signal detection theory and extensions: Unequal variance, random coefficients, and mixture models. Journal of Mathematical Psychology, 54, 304-313.
Green, D. M. & Swets, J. A. (1988). Signal detection theory and psychophysics. Peninsula Publishing.
Hautus, M. J., Macmillan, N. A., & Creelman, C. D. (2022) Detection theory: A userfs guide. Rootledge.
‰ª–{ˆÀ°i2019j‚¢‚Ü‚³‚ç•·‚¯‚È‚¢Python‚Ńf[ƒ^•ªÍDŠÛ‘Po”Å
Okamoto, Y. (2023). Extended 2AFC Rating Task. https://doi.org/10.17605/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‘–[
Wickens, T. D. (2002). Elementary Signal Detection Theory. Oxford University Press.
Wixted, J. T. (2019). The forgotten history of signal detection theory. Journal of Experimental Psychology: Learning, Memory, & Cognition, 46, 201-233.
•‹L
ƒŠƒXƒg‚P@ƒJƒeƒSƒŠ”
‚ª‹ô”‚Ìê‡itrip2AFC_KCat_even.stanj
//
//
Yasuharu Okamoto, 2026
//
functions {
real my_phi(real
x) {
if
(x <= -37.5) {
return 0.0;
}
else
if (x >= 8.25) {
return 1.0;
}
else
{
return std_normal_cdf(x);
}
}
}
data {
int K;
array[K] int nn_cond;
array[K] int ns_cond;
array[K] int sn_cond;
}
transformed data {
int hK;
vector[K%/%2] alpha;
hK
= K %/% 2;
for (i
in 1:hK) {
alpha[i] = 1.0;
}
}
parameters {
real<lower=-10,
upper=10> mu_s;
real<lower = 0.01,
upper=10.0> sgm_s;
real b;
simplex[hK]
preC;
}
transformed parameters {
simplex[K] nn_theta;
simplex[K] ns_theta;
simplex[K] sn_theta;
vector[K+1] nn_cum_p;
vector[K+1] ns_cum_p;
vector[K+1] sn_cum_p;
vector[K-1] C;
real vsum;
real sgm_nn;
real sgm_ns;
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));
nn_cum_p[1]
= 0.0;
ns_cum_p[1]
= 0.0;
sn_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;
for (i
in 2:K) {
nn_cum_p[i] = my_phi((C[i-1]
- b) / sgm_nn);
ns_cum_p[i] = my_phi((C[i-1]
- (mu_s + b)) / sgm_ns);
sn_cum_p[i] = my_phi((C[i-1]
- (-mu_s + b)) / sgm_ns);
}
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];
}
}
model {
mu_s
~ uniform(-10, 10);
sgm_s
~ uniform(0.01, 10.0);
preC
~ dirichlet(alpha);
b ~ normal(0.0, 1000.0);
nn_cond
~ multinomial(nn_theta);
ns_cond
~ multinomial(ns_theta);
sn_cond
~ multinomial(sn_theta);
}
ƒŠƒXƒg‚Q@ƒJƒeƒSƒŠ”
‚ªŠï”‚Ìê‡itrip2AFC_KCat_odd.stanj
//
//
Yasuharu Okamoto, 2026
//
functions {
real my_phi(real
x) {
if
(x <= -37.5) {
return 0.0;
}
else
if (x >= 8.25) {
return 1.0;
}
else
{
return std_normal_cdf(x);
}
}
}
data {
int K;
array[K] int nn_cond;
array[K] int ns_cond;
array[K] int sn_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<lower=-10,
upper=10> mu_s;
real<lower = 0.01,
upper=10.0> sgm_s;
real b;
simplex[hK+1] preC;
}
transformed parameters {
simplex[K] nn_theta;
simplex[K] ns_theta;
simplex[K] sn_theta;
vector[K+1] nn_cum_p;
vector[K+1] ns_cum_p;
vector[K+1] sn_cum_p;
vector[K-1] C;
real vsum;
real sgm_nn;
real sgm_ns;
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));
nn_cum_p[1]
= 0.0;
ns_cum_p[1]
= 0.0;
sn_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;
for (i
in 2:K) {
nn_cum_p[i] = my_phi((C[i-1]
- b) / sgm_nn);
ns_cum_p[i] = my_phi((C[i-1]
- (mu_s + b)) / sgm_ns);
sn_cum_p[i] = my_phi((C[i-1]
- (-mu_s + b)) / sgm_ns);
}
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];
}
}
model {
mu_s
~ uniform(-10, 10);
sgm_s
~ uniform(0.01, 10.0);
preC
~ dirichlet(alpha);
b ~ normal(0.0, 1000.0);
nn_cond
~ multinomial(nn_theta);
ns_cond
~ multinomial(ns_theta);
sn_cond
~ multinomial(sn_theta);
}
ƒŠƒXƒg‚R@ƒŠƒXƒg‚P‚ÌStanƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹‚ð—˜—p‚·‚éPythonƒXƒNƒŠƒvƒgiAnalTriP2AFCReven.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
import arviz
as az
inflnm = input('Input data file (*.xlsx) =
')
outflnm = 'Results.txt' # input('Output file (*.txt) = ')
fout = open(outflnm,
'w')
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]
if K % 2 == 1:
print('K should be even.')
import sys
sys.exit()
print('n_n
=', n_n)
print('n_s
=', n_s)
print('s_n
=', s_n)
model = CmdStanModel(stan_file = 'trip2AFC_KCat_even.stan')
Data = {'K':K, 'nn_cond':n_n, 'ns_cond':n_s, 'sn_cond':s_n}
fit = model.sample(data=Data)
print(fit.summary())
fout.write(f'\n{fit.summary()}\n')
inf_data = az.from_cmdstanpy(fit)
# Arviz(az) InferenceData
# ƒgƒŒ[ƒXƒvƒƒbƒg
az.plot_trace(inf_data, var_names=['mu_s','sgm_s','C'])
plt.tight_layout()
plt.show()
fit = fit.draws_pd() # Pandas DataFrame
q1, mu_s_med,
q3 = np.percentile(fit['mu_s'],
[25, 50, 75])
sb.kdeplot(fit['mu_s'])
plt.xlabel(r'$\mu_s$',
fontsize=16)
plt.title(r'Posterior
Distribution of $\mu_s$' +
f'\nq1={q1:.3f},
Med.={mu_s_med:.3f},
q3={q3:.3f}',
fontsize=16)
plt.show()
q1, sgm_s_med,
q3 = np.percentile(fit['sgm_s'],
[25, 50, 75])
sb.kdeplot(fit['sgm_s'])
plt.title(r'Posterior
Distribution of $\sigma_s$' +
f'\nq1={q1:.3f},
Med.={sgm_s_med:.3f},
q3={q3:.3f}',
fontsize=16)
plt.xlabel(r'$\sigma_s$',
fontsize=16)
plt.show()
C = []
for k in range(K-1):
C.append(fit[f'C[{k+1}]'])
C = np.array(C).T
s_title = ''
for k in range(K-1):
if k != (K//2) - 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:
plt.plot([0], [0], marker = 'o', markersize
= 15, c = 'r')
s_title += f'C{k+1}=0, '
plt.title('Med. estimates\n' + s_title, fontsize=16)
plt.show()
q1, b_med,
q3 = np.percentile(fit['b'], [25, 50, 75])
sb.kdeplot(fit['b'])
plt.xlabel('b', fontsize=16)
plt.title('Posterior Distribution of b' +
f'\nq1={q1:.3f},
Med.={b_med:.3f},
q3={q3:.3f}',
fontsize=16)
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]
fit_nn_cum_p = []
fit_ns_cum_p = []
fit_sn_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_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
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]
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([0,1], [0,1], c = 'k', ls = '--',
label = 'Obs.=Est.')
plt.xlabel('Est.Cum.P',
fontsize=16)
plt.ylabel('Obs.Cum.P',
fontsize=16)
plt.legend()
plt.title('Cumulative Proportions', fontsize=18)
plt.show()
fout.close()
print('\n', outflnm,
'was saved.\n')
ƒŠƒXƒg‚S@ƒŠƒXƒg‚Q‚ÌStanƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹‚ð—˜—p‚·‚éPythonƒXƒNƒŠƒvƒgiAnalTriP2AFCRodd.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
import arviz
as az
inflnm = input('Input data file (*.xlsx) =
')
outflnm = 'Results.txt' # input('Output file (*.txt) = ')
fout = open(outflnm,
'w')
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]
if K % 2 == 0:
print('K should be odd.')
import sys
sys.exit()
print('n_n
=', n_n)
print('n_s
=', n_s)
print('s_n
=', s_n)
model = CmdStanModel(stan_file = 'trip2AFC_KCat_odd.stan')
Data = {'K':K, 'nn_cond':n_n, 'ns_cond':n_s, 'sn_cond':s_n}
fit = model.sample(data=Data)
print(fit.summary())
fout.write(f'\n{fit.summary()}\n')
inf_data = az.from_cmdstanpy(fit)
# Arviz(az) InferenceData
# ƒgƒŒ[ƒXƒvƒƒbƒg
az.plot_trace(inf_data, var_names=['mu_s','sgm_s','C'])
plt.tight_layout()
plt.show()
fit = fit.draws_pd()
# Pandas DataFrame
q1, mu_s_med,
q3 = np.percentile(fit['mu_s'],
[25, 50, 75])
sb.kdeplot(fit['mu_s'])
plt.xlabel(r'$\mu_s$')
plt.title(r'Posterior
Distribution of $\mu_s$' +
f'\nq1={q1:.3f},
Med.={mu_s_med:.3f},
q3={q3:.3f}',
fontsize=16)
plt.show()
q1, sgm_s_med,
q3 = np.percentile(fit['sgm_s'],
[25, 50, 75])
sb.kdeplot(fit['sgm_s'])
plt.title(r'Posterior
Distribution of $\sigma_s$' +
f'\nq1={q1:.3f},
Med.={sgm_s_med:.3f},
q3={q3:.3f}',
fontsize=16)
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 = ''
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 += ', '
plt.title('Med. estimates\n' + s_title)
plt.show()
q1, b_med,
q3 = np.percentile(fit['b'], [25, 50, 75])
sb.kdeplot(fit['b'])
plt.title('Posterior Distribution of b' +
f'\nq1={q1:.3f},
Med.={b_med:.3f},
q3={q3:.3f}',
fontsize=16)
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]
fit_nn_cum_p = []
fit_ns_cum_p = []
fit_sn_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_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
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]
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([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')