Rのコードをpythonに書き換えたいと思っています。
実装したい内容は、以下で、ziは標準正規分布の累積分布関数をあらわします。
アンダーソンダーリング検定を1から実行して、最終的にA*>0.752 がシミュレーション回数のうち何個あるかで、検出力を出力したいと考えています。
Rのコードは以下です。
R
1n = 50 2sim<-100 3count<-0 4 5MAD<-function(){ 6 for(i in 1:sim){ 7 #rdata<-rlogis(n,0,1) 8 rdata<-rt(n,1)#累積分布関数に使用する分布から乱数をとる。 9 data<-sort(rdata)#順序統計量(小さい順に並べかえる) 10 cdf<-pnorm(data, mean(data), sd(data))(b11f778f7ed7ac3a11db5dfa9fb94c49.png) 11 S <- 0 12 for(i in 1:n){ 13 S <- S + (2*i-1) * (log(cdf[i])+log(1 - cdf[n + 1 - i])) 14 } 15 AD <- ( - n - S/n)*(1 + 0.75/n + 2.25/n^2) 16 #print(b1)# 統計量 17 if(AD >= 0.752){ 18 count <- count + 1 19 } 20} 21print(count/sim)#検出力 22} 23MAD()
自力で書き換えたpythonは以下です。しかし、print(MAD)の部分が1より大きい値になってしまい、どこが誤っているのかわからない状態です。
python
1def MAD(): 2 count = 0 3 sim = 100 4 for s in range(1,sim): 5 rdata = np.random.standard_t(1, size=50) 6 data = sorted(rdata) 7 n = len(data) 8 mu = np.mean(data) 9 seg = np.std(data) 10 # cdfで累積分布関数を生成 11 # F0 標準正規分布の累積分布関数 12 S = 0 13 for i in range(1,n): 14 X = data[i] 15 F0 = stats.norm.cdf(x=X, loc=mu, scale=seg) 16 XX = data[n- i] 17 FF = stats.norm.cdf(x=XX, loc=mu, scale=seg) 18 S += (2 * i - 1)*(math.exp(F0) + math.exp(1-FF)) 19 MAD = (- n - S/n) *(1 + 0.75 / n + 2.25 / n**2) 20 print(MAD)#統計量 21 if MAD >= 0.752: 22 count += 1 23 else: 24 pass 25 power = count / sim 26 print(count) 27 print(power) 28 29MAD()
Rを書き換えたpythonのコードを教えて頂きたいです。
よろしくお願い致します。