"""G04: explicit statistical procedures; validity still needs a sampling model."""importmathimportrandomdefwilson(successes,trials,z=1.96):iftype(trials)isnotintortype(successes)isnotintornot0<=successes<=trialsortrials<1:raiseValueError("integer counts with 0 <= successes <= trials required")ifnotmath.isfinite(z)orz<=0:raiseValueError("finite positive critical value required")p=successes/trialsdenominator=1+z*z/trialscenter=(p+z*z/(2*trials))/denominatorhalf=z*math.sqrt(p*(1-p)/trials+z*z/(4*trials*trials))/denominatorreturnmax(0.,center-half),min(1.,center+half)defentropy(probabilities):p=list(probabilities)ifnotporany(notmath.isfinite(x)orx<0orx>1forxinp):raiseValueError("nonempty finite probability vector required")ifnotmath.isclose(math.fsum(p),1.,rel_tol=0.,abs_tol=1e-12):raiseValueError("probabilities must sum to one")return-math.fsum(x*math.log2(x)forxinpifx>0)defquantile(values,probability):values=sorted(values)ifnotvaluesornotmath.isfinite(probability)ornot0<=probability<=1:raiseValueError("nonempty data and probability in [0,1] required")ifany(notmath.isfinite(x)forxinvalues):raiseValueError("finite observations required")position=(len(values)-1)*probabilitylo=math.floor(position)hi=min(lo+1,len(values)-1)fraction=position-loreturn(1-fraction)*values[lo]+fraction*values[hi]defpaired_bootstrap(old,new,repeats=2000,seed=21,confidence=.95):iflen(old)!=len(new)ornot2<=len(old)<=10000:raiseValueError("2..10000 matched pairs required")iftype(repeats)isnotintornot100<=repeats<=10000:raiseValueError("100..10000 resamples required")ifnotmath.isfinite(confidence)ornot0<confidence<1:raiseValueError("confidence must lie in (0,1)")ifany(notmath.isfinite(v)forvin[*old,*new]):raiseValueError("finite measurements required")differences=[b-afora,binzip(old,new)]ifany(notmath.isfinite(d)fordindifferences):raiseValueError("difference overflow")rng=random.Random(seed)n=len(differences)means=[math.fsum(rng.choice(differences)for_inrange(n))/nfor_inrange(repeats)]tail=(1-confidence)/2return{"mean_difference":math.fsum(differences)/n,"interval":(quantile(means,tail),quantile(means,1-tail)),"seed":seed,"pairs":n,"resamples":repeats}if__name__=="__main__":print("Wilson:",wilson(18,20))print("Entropy:",entropy([.5,.25,.25]))print(paired_bootstrap([10,20,30],[8,18,28]))