@@ -33,7 +33,9 @@ def preprocessing(results: Union[PathLike, pd.DataFrame]) -> pd.DataFrame:
33
33
estimating the metacognitive sensitivity meta-d' (`bayesian_dprime`,
34
34
`bayesian_criterion`, `bayesian_meta_d`, `bayesian_m_ratio`). The dprime and
35
35
criterion can vary between the two methods. It is recommended to use the estimates
36
- consistently.
36
+ consistently. Before the estimation of SDT and metacognitive metrics, the function
37
+ ensure that at least 5 valid trials of each signal are present, otherwise returns
38
+ `None`.
37
39
38
40
When using this function for analysing results from the Heart Rate Discrimination
39
41
task, the following packages should be credited: Systole [1]_, metadpy [2]_ and
@@ -53,8 +55,7 @@ def preprocessing(results: Union[PathLike, pd.DataFrame]) -> pd.DataFrame:
53
55
Notes
54
56
-----
55
57
This function will require [PyMC](https://github.com/pymc-devs/pymc) (>= 5.0) and
56
- [metadpy](https://github.com/embodied-computation-group/metadpy) (>=0.1.0) to work
57
- correctly.
58
+ [metadpy](https://github.com/embodied-computation-group/metadpy) (>=0.1.0).
58
59
59
60
References
60
61
----------
@@ -101,54 +102,70 @@ def preprocessing(results: Union[PathLike, pd.DataFrame]) -> pd.DataFrame:
101
102
)
102
103
this_modality ["Responses" ] = this_modality .Decision == "More"
103
104
104
- hit , miss , fa , cr = this_modality .scores ()
105
- hr , far = sdt .rates (hits = hit , misses = miss , fas = fa , crs = cr )
106
- d , c = sdt .dprime (hit_rate = hr , fa_rate = far ), sdt .criterion (
107
- hit_rate = hr , fa_rate = far
108
- )
105
+ # check that both signals have at least 5 valid trials each
106
+ if (this_modality ["Stimuli" ].sum () > 5 ) & (
107
+ (~ this_modality ["Stimuli" ]).sum () > 5
108
+ ):
109
+
110
+ hit , miss , fa , cr = this_modality .scores ()
111
+ hr , far = sdt .rates (hits = hit , misses = miss , fas = fa , crs = cr )
112
+ d , c = sdt .dprime (hit_rate = hr , fa_rate = far ), sdt .criterion (
113
+ hit_rate = hr , fa_rate = far
114
+ )
115
+ else :
116
+ d , c , = (
117
+ None ,
118
+ None ,
119
+ )
109
120
110
121
# metacognitive sensitivity
111
122
# -------------------------
123
+ (
124
+ bayesian_dprime ,
125
+ bayesian_criterion ,
126
+ bayesian_meta_d ,
127
+ bayesian_m_ratio ,
128
+ ) = (None , None , None , None )
129
+
112
130
this_modality = this_modality [
113
131
~ this_modality .Confidence .isna ()
114
- ] # Drop trials with NaN in confidence rating
132
+ ]. copy () # Drop trials with NaN in confidence rating
115
133
this_modality .loc [:, "Accuracy" ] = (
116
- this_modality ["Stimuli" ] & this_modality ["Responses" ]
117
- ) | (~ this_modality ["Stimuli" ] & ~ this_modality ["Responses" ])
118
-
119
- try :
120
- new_ratings , _ = discreteRatings (
121
- this_modality .Confidence .to_numpy (), verbose = False
122
- )
123
- this_modality .loc [:, "discrete_confidence" ] = new_ratings
124
-
125
- metad = bayesian .hmetad (
126
- data = this_modality ,
127
- stimuli = "Stimuli" ,
128
- accuracy = "Accuracy" ,
129
- confidence = "discrete_confidence" ,
130
- nRatings = 4 ,
131
- output = "dataframe" ,
132
- )
133
- bayesian_dprime = metad ["d" ].values [0 ]
134
- bayesian_criterion = metad ["c" ].values [0 ]
135
- bayesian_meta_d = metad ["meta_d" ].values [0 ]
136
- bayesian_m_ratio = metad ["m_ratio" ].values [0 ]
137
-
138
- except ValueError :
139
- print (
140
- (
141
- f"Cannot discretize ratings for modaliti: { modality } . "
142
- "The metacognitive efficiency will not be reported."
134
+ (this_modality ["Stimuli" ] & this_modality ["Responses" ])
135
+ | (~ this_modality ["Stimuli" ] & ~ this_modality ["Responses" ])
136
+ ).copy ()
137
+
138
+ # check that both signals have at least 5 valid trials each
139
+ if (this_modality ["Stimuli" ].sum () > 5 ) & (
140
+ (~ this_modality ["Stimuli" ]).sum () > 5
141
+ ):
142
+
143
+ try :
144
+ new_ratings , _ = discreteRatings (
145
+ this_modality .Confidence .to_numpy (), verbose = False
146
+ )
147
+ this_modality .loc [:, "discrete_confidence" ] = new_ratings
148
+
149
+ metad = bayesian .hmetad (
150
+ data = this_modality ,
151
+ stimuli = "Stimuli" ,
152
+ accuracy = "Accuracy" ,
153
+ confidence = "discrete_confidence" ,
154
+ nRatings = 4 ,
155
+ output = "dataframe" ,
156
+ )
157
+ bayesian_dprime = metad ["d" ].values [0 ]
158
+ bayesian_criterion = metad ["c" ].values [0 ]
159
+ bayesian_meta_d = metad ["meta_d" ].values [0 ]
160
+ bayesian_m_ratio = metad ["m_ratio" ].values [0 ]
161
+
162
+ except ValueError :
163
+ print (
164
+ (
165
+ f"Cannot discretize ratings for modality: { modality } . "
166
+ "The metacognitive efficiency will not be reported."
167
+ )
143
168
)
144
- )
145
-
146
- (
147
- bayesian_dprime ,
148
- bayesian_criterion ,
149
- bayesian_meta_d ,
150
- bayesian_m_ratio ,
151
- ) = (None , None , None , None )
152
169
153
170
# bayesian psychophysics
154
171
# ----------------------
0 commit comments