27 #ifndef SHORE_STATISTICS_MTC_HPP__
28 #define SHORE_STATISTICS_MTC_HPP__
60 std::vector<double> m_rawp;
62 std::vector<size_t> m_rawp_ord;
65 void runBhCorrection(Iter res)
69 res[*m_rawp_ord.rbegin()]=m_rawp[*m_rawp_ord.rbegin()];
70 for(
int i=m_rawp_ord.size()-2;i>=0;--i)
72 const size_t j=m_rawp_ord[i+1];
73 const size_t k=m_rawp_ord[i];
75 const double c=
static_cast<double>(m_rawp_ord.size())/(i+1);
76 const double d=std::min(c*m_rawp[k],1.0);
78 res[k]=std::min(res[j],d);
83 void runBonferroniCorrection(Iter res)
85 for(
size_t i=0;i<m_rawp.size();++i)
87 res[i]=std::min(m_rawp[i]*m_rawp.size(),1.0);
92 void runHolmCorrection(Iter res)
96 const size_t m=m_rawp_ord.size();
97 res[m_rawp_ord[0]]=std::min(m_rawp[m_rawp_ord[0]]*m,1.0);
98 for(
size_t i=1;i<m;++i)
101 std::min(m_rawp[m_rawp_ord[i]]*(m-i),1.0);
104 std::max(scaled,res[m_rawp_ord[i-1]]);
109 void runHochbergCorrection(Iter res)
113 const size_t m=m_rawp_ord.size();
114 res[*m_rawp_ord.rbegin()]=m_rawp[*m_rawp_ord.rbegin()];
116 for(
int i=m-2;i>=0;--i)
118 const double sc=std::min(m_rawp[m_rawp_ord[i]]*(m-i),1.0);
120 std::min(sc,res[m_rawp_ord[i+1]]);
125 void runSidakSsCorrection(Iter res)
127 const int m=m_rawp.size();
129 for(
size_t i=0;i<m_rawp.size();++i)
131 res[i]=1.0-std::pow(1.0-m_rawp[i],m);
136 void runSidakSdCorrection(Iter res)
140 const int m=m_rawp_ord.size();
142 1.0-std::pow(1.0-m_rawp[m_rawp_ord[0]],m);
147 std::max(res[m_rawp_ord[i-1]],
148 1.0-std::pow(1.0-m_rawp[m_rawp_ord[i]],m-i));
153 void runByCorrection(Iter res)
157 const size_t m=m_rawp_ord.size();
160 for(
size_t i=3;i<=m;++i) a+=1.0/i;
162 res[*m_rawp_ord.rbegin()]=
163 std::min(a*m_rawp[*m_rawp_ord.rbegin()],1.0);
165 for(
int i=m-2;i>=0;--i)
167 const double sc=std::min(m*a*m_rawp[m_rawp_ord[i]]/(i+1),1.0);
169 std::min(res[m_rawp_ord[i+1]],sc);
175 void ensureOrdering();
182 mtc(Iter rawp_start,Iter rawp_end)
184 std::copy(rawp_start,rawp_end,std::back_inserter(m_rawp));
187 void addRawValue(
const double val);
190 void correctPvalues(
const mtcmethod m,Iter result)
194 if(!m_rawp.empty()) *result=m_rawp[0];
199 runBhCorrection(result);
202 case FWER_BONFERRONI:
203 runBonferroniCorrection(result);
207 runHolmCorrection(result);
211 runHochbergCorrection(result);
215 runSidakSsCorrection(result);
219 runSidakSdCorrection(result);
223 runByCorrection(result);
227 throw "unhandled p-value correction method";
238 #endif // SHORE_STATISTICS_MTC_HPP__