質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

1回答

1542閲覧

Rのコードをpythonに書き換えたい

emiime

総合スコア27

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

0クリップ

投稿2021/10/03 06:46

編集2021/10/03 16:24

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のコードを教えて頂きたいです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2021/10/03 10:38

Sの値は間違いなく算出出来てるのでしょうか。python版とR版で微妙に式の立て方が違うようですが。
emiime

2021/10/03 10:55

R版が正しく、自分で考えたのは、python版なのですが、自分では同じだと思って、pythonを組んでみたのですが、どこが違っているのかがわからなく詰まってしまいました。 ただ、python版のXX = data[n - i] の部分は エラーが出てしまったため、一旦XX = data[n - i]としましたが、XX = data[n + 1 - i] に直そうと思っています。 Rと比べた時にpythonはどこが異なっているのかでもわかれば教えて頂きたいです。
KojiDoi

2021/10/03 11:12

>どこが異なっているのか 煩雑なのでコードはきちんと追ってませんけど、どうみてもSの定義の式は違っていますよね。 なぜ変えているのですか? まずは、極力R版に寄せて組んでみるべきです。変数名もできるだけ同じにしましょう。そして、Sの値を出力して、両版で違いが出ないか見るのです。Sが問題なさそうなら、その前のcdfとやらを比較して違い長いかチェックする。そういう基本的なチェックがいい加減なまま悩み続けるのは時間の無駄です。
bsdfan

2021/10/03 12:00

まずは乱数を使わずに、同じ配列を入れた時に同じ値になるかを、それぞれの行ごとにチェックしながらやるといいと思います。
emiime

2021/10/03 14:39

乱数を使わずにやってみます!ありがとうございます!
guest

回答1

0

ちゃんと中まで確認していませんが、Rの式では、2つめのループの外にADの計算がありますが、pythonのものは2つめのループの中に入っています。

2つめのループの中で(M)ADを計算して条件に合う数を数えているのですから、simより大きくなってしまうのでしょう。

投稿2021/10/03 08:51

TakaiY

総合スコア12763

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

emiime

2021/10/03 10:15

for文の外に、MAD =の式を出してみたのですが、(上記編集の通り)そうすると、1つ目のfor文でSが変化するのに対して、MADの式に当てはまるSが変化しないことになってしまうと考え、 MADをループから出す方法?の書き方がよくわからない、と詰まってしまいました。 もし、追加のアドバイス頂けると嬉しいです。
TakaiY

2021/10/03 13:48

僕も詳しいわけではありませんが、 ループの中にある、この式でSは積算されていますよね。 S <- S + (2*i-1) * (log(cdf[i])+log(1 - cdf[n + 1 - i])) その積算結果を使っていますから、それでいいのではないかと思いますよ。 pythonの処理がRの処理と同等なのかどうかはわかりません。 ですが、pythonの式は引いているのがちょっと気にはなります。 S -= (2 * i - 1)*(math.exp(F0) + math.exp(1-FF))
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問