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

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

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

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

Python

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

統計

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

Q&A

受付中

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

emiime
emiime

総合スコア27

R

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

Python

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

統計

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

1回答

0グッド

0クリップ

773閲覧

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2021/10/03 10:37依頼された後にこの質問は修正されています

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

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

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

回答1

0

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

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

投稿2021/10/03 08:51

TakaiY

総合スコア10513

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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))

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

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

R

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

Python

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

統計

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