計算機支援数学:メンデルの法則 -偽造疑惑は本当か 松本 眞 [email protected] 平成 20 年 9 月 30 日 1 メンデルの法則 というのはご存知でしょう。エンドウ豆を例にとる。 丸い豆だけができるエンドウを何代にも渡って純化する。一方、しわしわの 豆のエンドウを同様に純化する。 純粋な形質をもつ二つの親(丸、しわ)をかけ合わせる。すると、できた種 を撒いて得られた個体(雑種第一代 F1 , 子のラテン語は filius)は全て丸い種 子を実らせる(優性の法則)。次に、それら同士をかけ合わせた種子から得ら れた個体(雑種第二代 F2 )に実る種子は、丸いものばかりがなる個体としわ のものばかりがなる個体がまざり、その比はおよそ 3:1 である(分離の法則)。 メンデルは、これを AA × aa = 4Aa; Aa × Aa = AA + 2Aa + aa という式で説明し、なにか「遺伝子」がペアとなっているのだと結論した。 2 疑惑 メンデルは修道院で日々エンドウをまき、膨大なデータを集めて上の結論を 導いた。次ページは、メンデルの実験結果である。(僕が中学生のころの教科 書、「図説生物 I」実教出版からのコピー。)これに対し、統計学者 Fischer[1] は 1936 年、 「この実験結果はあまりにも3:1に近すぎる」ということを数学 的に証明した。(次の次のページ。参考:[2] に記述がある。) 1 酔 洋 S耐 中 S語 猟 . 耐中 一 詩約 A 書 ぉ ヽ N・ CO 一串 窯 洋 句” S恭点 一S い・ O︻ 的・ 中働 ヽ・ 一〇 時・ ∞ヽ い ︼ふ や・ 一ト ず 再 雨 葛 ︼∞ は ω 肺耐 ≡ 〓 i 寺 tS じ い 再 再 汁 ド 再 舟 げ 丼 丁 併 丁 予 ざ さo 仲S r 併寸 鋤 じ 慨岬 ク 球 予 げ︼ . 性再︼ 卓 再 遵 再岐 ぷ 仲 併時 け C A 丁 いo Cサ F河 革 再・ 亨 ヽ Lま ヽ準 ≡ 併 チ子 丁︼中 ︼ 逆 ︹せ 丼 子齢 ゆ チ併 伊 ︹ 併鮮予 げきキ 時 ︺卜 洸 片 ︺札 ︹ 併き 牝 ナ雛 いo ﹁ \ 〓寺予︼○ 津挿まお 併F︿ 申 時力ま汗澪SH 丁・○ い ︿S洲詳ゝ 拶 ︶ヽ本S t 諜憩ま 片 ︿精 時辞﹂。③ B閑粋き 時中 ︶きさ︻, Hヽ丹 丼 ﹂再 片ぷI非滞祭税廿 仲 じ 石 ︿子岸 Lヽ洋耐 S将輝革革 併 ぼAキ 今首A丁 が・ 辞 鴻ばれ い︻持﹁いデ榊漱 水 いギ 中浄 様 申昧い柄神神﹁ P y ヽ︶ 遵 S力 再 村坤 \ S 母 ヨ の 鞘 ︺ 時 F A 可 曇 S 矛 再 章︼ ︼ 伝 鮮ぶ cA 句 侍丁 中 ヽ ゆ譜 巾 ︻予 げ寸 ばヽ 器 麟 ぷ P力 吊 均〓 選 時み 吊 可 子 に併 ︶片 9再坤 キ ・ 電 一 話 〒 〒 誘 子 もR 卜 再︼ 遵 S湘 狙 ︵ ミ瓜 ︶税中 ︹酎 き さ 遵 将 時 腎 酎 併丁子・ 回 年 藤 切し いヽさ 0・ ONN ヽOu ”∞N いヽф Oり︼ 村∞﹃ ミミ悪醤将自ヒ 五 因 岩 H マ イせ 鮮癖 もバ S 料 総 湘 輝 津キF 吉 いい 藤 濁 S岸さ S自 聯 囲 ︻ミ狙 ま げ︼ oA字 が ︹ 併時 料 榊 併片卜 ︻ 丁 いo コ S憩 ボ 洲 N x ヽ札 や S 湘 輝 辞 粗 ︵ ■藤 暮郵S韻 や︶ 町S尊 やお き件 ] 奎 郵 ■月 津 ゝ ヽ洸ヽま離耐 S群聖 S津浄 下津 ば汁S再 H \ 単 〓せ付丁 ︺革持 ミ瓜 ︼ S再 も中 じF汁︼ コ蛸料 き 時﹃ ゆ革革 時牌 qヽ さ ︿Sミ潟 S岸ツサ げ︱ じ 域じSミぬ 再時 ECAホS離捕 時聖え︼湘輝華 瀬 鮮主蚕寺 がS話 せ澤S謹 縮 時 併もAヽ詳 響ご 再津目 c汁 ︹併丼 生鮮雛こ さ 仲併税︻ 中ぶ。 ゝ ヽ対辛再︼料 輝謙湘 時 ﹁ きさ然曲 再垂キ が黒料﹂ 併子 ︺詳 澪戸 時 併じや 富獄 や 再津滞 ぼ汁。 Fツ ば︼照尋S報準 再再 じ げ 翠 き 戦, S8 ■ 戸丼 も 小汁 、き 菫 料︹試料 詳岸い 暑いい 」 ︹S 片 ︶丼離 酎 お 滅 沖 F再︼ LS 片 ゆ丼 中 い じ税 予 ぶじ 注 い ゆサo ユ瞥 S S S S S け岸い憩いい 憩 ● X マ︼ や S 軒 型 S 滞 コ 辞岸い 苦いぃ X× Xxxxx 募 遠津^B葦 「 戸・ 陣 粛 S 軒 型 s サ 尋け廿キ ︵ 料 器 ︶︹ 片 もA︺渕 球 お 鉾 挿 誌 S Si麟 鮮騨 加 ぼ片 ︺ 併↓ が排 出 吊︼ 球 ︿予 げ酎 き ざ A 子汁。 いS 仲 併再濁 塀 時 ナもA丁 汁 ゝ ヽ︼ ヽ再︼ ︱ も 戦 も じミ 恩 戸岸 口F︼ 淋 諜 再 片もA恥 汁器麟 S ■寺時臨 既 驚 F汁o 本 ぼA︺ ︱ も 油尋︺ 円 丁 苔 洲︶S H ヽ ●ミ 潟 S中 駅 税 お げき さ 猟 群 ︵ ゝ ヽ洸 ヽ吊︺ □洲料 尊 鮮 ︿ じ尚 F︼ 丁じ チコ ミ 恩 税 中 駅 高 性じ 片 ︺戸酎 き じA 丁 ︽サ 時測 力 ︺ 再 再じ A︼洋耐 じ Y ぼサ 汁 再軒 聖 障 税 け が r 併時 ■ ケ 注 ぼ汁。 好 時 辞 麟 S時 弗 a 障酎 中 器 営 s 障姉 ︶ 高 序 も 幣 せ図 聖 ハ 畔 ぶミ 濁 ︵ 挫 持 ミ 温 ︶時 チ も汁 苔 氷 L ︺ぼ時 議 命 に 付 FA ︺ 料 器 CA お げ 首 が 器 麟 器 ︼弁 電 ︼ に お ︺ F S 四N 淋 き 再 片 伊 ︶再 廿 尋 ぷミ 瓜 S 拶 げき き 予 汁 時 訓 え ︺ も A S げき が諜 麟 消 や弁 ︵ 灘 時S 片 ゆ岸 辞 湘 鮮 恥 汁 。 ゝ く札 ヽ 吊 ︺ ︹ き 戸 片 もA 町”戸 再 字も ハ ナI W S 湖 S ミ 瓜 満 尋 税 け げ寸 ざ が 付 併鮮 紳 コ C汁 。 ] ≧ 欝 ■潟 群 百 母 ↓ を津器 + s S Ⅲ 2 薩 一 十 一_― 十 司 十 可 拶 l B 4け 詳は 語 卓 語 避 爺 蔵 サ ■S 畿 ざ い引 キ ロ野漸 uS き ヽ N紳耐 軍︺ 粘 覇 S 対︱ ヽS韻 ゆ ・臣 鴻 S耐 ハ 針 も汁・消 博 ︼︱ ヽ ︵ >︶S導 ゆ ︺梓=静 軍 w ヽヽ卜 時部ゆ 再 汗え A 粗対 S 法 判 マ X 付 併い 時 ←言 F汁 洋じ 母 ヽ N紳 耐 手洋 研 ︿︺ 哨 v 併 いS耐 戦読 弟 言耐 r じお い耐 時 も汁 研 ︿母 s討・ 消 博 ︼︱ ヽ G ︶S部 ゆ ・尊 へ N紳 耐 再前 F■ド 畔 丁高 性高テ ” ︿・報 肝 汁 ゛壮 地︱ ヽ母翠 岩 S 翌 群甫 高ゆ む作 時 ← 併 Fハ 丁肘 仲 併︼部 や 常さ い・ も 性高・ 陣前 報 S勝隷 常 FA↓ 回鴻 ︿岩 予ド ハ 丁 いとポ ミ潟 S軒 聖 時 肝 卜 札 ヽ マ︼ 忘 戸 時 い激 部 S 河 対︱ ヽ高じ 丁 へ郎 瀬 F時 ︼ 対 ヽ ヽマ オ1 6 一 浄 q F o口 〓? SS 再・小S 将 ロキタ 研串 料 S 戸じ 高 廿 丁 A・ 5 ︿も サ S渦 輝 言廿 尋 N xマ出 や S脳 誹 併望= ︼︱ ヽ 常S ↓ ド 3 高じ 丁 AS 母 ヽ い紳 部 響 抑 付弟 じ 汁・ホS群 瀬 母洲 や 主 r 引 +・洲 サ ■還 予サ 畔 片 ←言・ 小ド ヽざ S韻 ゆ 言廿 専 い卜 豊 認 穏 再 い寸S A副 ︿・ 潤 響 高臣 ゆ キ い い ←高 判︱ ヽ戦前 辞 けド A 丁 討 併丁 ←鮮 丁潮 丁世 一肘ざ 討・ け 予一 P 切む S粘部 勝 手 時 叫 併じ 汁部ゆ S臣い 溺 S認穏 再 ︲〇・ H﹃ヽP P︲ OCCOいH OO・ OOO 備研寸じ ハテ け 母耐 言 時 い。 対 ヽ くヽキー 再 仲S訴 湘 言じ 丁Aも 鶴S 時 ←言郭 鞘 母当 トヘ 丁 N・ v ﹁ 部 河 ギえ 研挫 還 併再 丁 卜 母 丁世︺忙S 片 ←母訴 抑 乾お 予ざ いr 併世 0・ 一〇 中 Ⅱ 母 澪 v ︶ ぐ 玉 輪 薄 ︵ 言 、 ︶ や・ ] ゆ∞0 0, Cふ 0・ 0切 0・ ﹃ふ 0・ ︼ ﹃ωω N・ ∞中い 0 0・ 0〇一﹃ 中 切・ いヽNふ いや 0﹃い0 出 ∞卜 \ヽ対ヽS滑癖言廿年伊路辞威学予Sヽマ付 引キヽ爺併認■ 競翌薄辞S 汁SS粘部 す ︼S汗 ︼ ︼S洋 N囲中 洋爺 汗 い□中 0・ OCO∞ヽ ・ 聖 出︱ ヽ業部S況購 付W激 ︱︱ 出︱ ヽS野選 ︵ 産将 ︻知 >・コ多o 毛じ 0・ CCCCω 0・ C0 卜P・ OCり0 甚 韻 言 いい腸翌 ω輯 眠 叫 c丁サ 付準岩 FA 丁 討洋 ぶ S事 料轟 辞 加 戸 時 SAや ヽマ地 ヽ 予 澪 サ ド ハ 丁 汁H辞辞 世 き い・ “SH 総辞 軍︺ 湖癖 判︱ ヽS 高 併卜 に キえ ペ ハ再 母ぐ ︵ こ世 ヽマ出ヽS蚤 辞 言 い寸じ A 時 ︿ゆ 輝 キ い 時 ←言 球 祥 けさ A 丁 討 併丁 ←遵 S鞘 津 戸 時SA 伊料部 いさ いS ハ ■ い﹂ チー 章 ︼ マ ︵ ■い︼ ユ”君 雷 ︶軍障酎 報 球 戸 時dハ器 叶 ”ド 討︺競 糾 けさ 討 脳 郭 言 い廿S A 時 ︿ゆ 蝉 キ い出︱ ヽ 母逮 引 Fハ 丁 い。 チー ヽ 出 マ露・ 粘 部 雌 壮 対︱ ヽS前 酢 付津 コ キ い討S F部 翠 図 ︼ 忙S 時 ←母薄 沖 時コ 5 い サ 声も 丁 A翠当 官A 丁 い 併キ ざ亮や 湘 揮 雌 再 ホざ 予S訴 辞 高 いもハ 地︱ ヽ戦沖 廿 r丁 併コ爵 ■ド 母 丁 キ ←言 現︱ ヽS前 酢 時奇 丁・ 戴 排 測鵬 S番 田 ︵識 辞 悌ざ A 丁 い隠 華 世 出︱ ヽ高臣い キ い 仲 伴母= 対 キ いヽ伊 ゛ ← 常 v 益説 F・ rざ 時 ヽ洋 S前肝 分8 oヨ伍qαq F汗“ oし 伸ゆ ぶ ぼ汁・ 丁 叫・ ■ い NS S朝 出 蛍 ω一岸S聖ゆ ︻摩翌 キ い 併丁 ←脳 郭 戦 予 も汁 併 Fい ←・仲 S 併仰・NS S増 狩 S 匿遵 S聖ゆ 併 FA 的¨ドサ ■雌 F ︿課 ド 汁耐 い常 丁 蔵 律障 亮 畿・ヽS 汁じ・田 誹 サ ■S キざ 時引 キ 母 へ や湘耐 軍洋 研キ 牡 ●テ けキ 性 い F畔 丁齢 母 常い 時 ←声キ い付 併再・ 韓 声H辞 ハ ■ い・ Fサ F・ vS r 時 ←母 N洋 S前祥 付薄 喜+ い部 響 S薄 沖 世 討討 キ い・ 辞 再 サ も A コ瑞 S i > ︵ き い翌 報 雌 再 弓 併 I S E出 競 澪 世 岸ど 高 さ い 併丁 ←脳 郭 母料 部 F Fサ い前 肝 S沖 韓 母肝 Fけ牛 畔丁 時 ←母消 船 S 選 由 S ↓ 併 I S栄翌 時甜膨 キ い時 ←粛 対 F汁 伸仲゛︺甫 再じ 性S 時 ←畔沖聖 Gc由 S I 備 単 由 S 弓 サ ■畔 い︶付瀞 洲 F汁・ 弓 工 弓 E 弓 I E 弓 ■ I 呂 ↓ 弓 E 弓 〓 弓 〓 ■ エ 弓 E ■ 工 弓 ■ 弓 〓 ↓ ﹃ H 工 弓 弓 I 弓 ↓ 工 ■ ■ 弓 〓 〓 弓 弓 I 〓 ■ ↓ 冨 弓 併 I S E餌 競 澪 戦 ︼〓 サ ■にS耐 澪 ↓ ざ へ 丁 いサ 付引 キ き ヽ N紳 部 製沖 S耐 再 、 や01い0︶ヾNω十 ︵ NドーやりヽヽやりHド・ XH︵ N∞ ヽ、 3 僕の担当する授業では、かならずしも Fischer の用いた方法にこだわらずに 「この実験結果はあまりにも3:1に近すぎる」かどうかを議論して行きたい と思う。 Fischer の用いたデータはメンデルの元論文から集められたもので、別紙 1 はそのごく一部に過ぎない。 (Fischer の用いたデータが入手できそうだと言う 人は、メールでご連絡ください。) 一方、次はとあるホームページから無断で借用してきた、とうもろこしから 得られたメンデルの法則を示すデータである。 黄色・丸 黄色・凹 紫色・丸 紫色・凹 実際の数 348 116 114 45 予想の数 実際の割合 予想の割合 350 7.7 9 117 2.5 3 117 2.5 3 39 1 1 一方、次はホームページ http://www5a.biglobe.ne.jp/~kaiko/mago-13.html から無断で借用してきた、カイコから得られたメンデルの法則を示すデータで ある。 黒い体 グレーの体 こぶなし 2 5 こぶあり 8 17 合 計 10 22 白い体 2 6 8 合計 9 31 40 ----------------------------★まご P (55頭)こぶこと KP 過剰肢の孫 こぶ有り : こぶ無し 42 頭 : 13 頭 だいたい 3:1 腹肢 5 対 : 腹肢 4 対 37 頭 : 18 頭 ★ 2:1 ですね。 これらのデータは、妥当なものなのだろうか? 4 3 妥当性・偽造性を示す方法 3.1 シミュレーション コンピュータプログラムを書いて、乱数を用いてこれらの実験のシミュレー ションを行って見る。果たして、実験結果は 3:1 や 9:3:3:1, (1:2:1):(3:6:3) とい う比率にどれくらい近いだろうか。 3.2 確率計算 力づくの確率計算で、「誤差がこれ未満」という計算を行って見る。シミュ レーション結果と比べてみる。 「誤差」をどう定義するか?差の自乗和? 差の絶対値の和? 3.3 カイ自乗検定 メンデルのデータのような、大きなデータを力づくで確率計算するのは困難 である。 カイ自乗検定を用いて、メンデルのデータを解析してはどうか?(これは、 カイ自乗検定についてすでに知識のある学生を対象とした問いである。データ は別紙 2 参照。) 4 研究課題 果たして、メンデルの実験結果は偽造なのか。 メンデルの法則にまつわる実験結果について、計算機を用いて何らかの方法 で検証・検討を行い、報告せよ。報告は口頭で 2008 年 10 月 30 日(木)の授 業にて行う(各人発表時間 10 分程度)ほか、A4 のレポート用紙にまとめて 11 月 6 日(木)16 時までに数学事務室まで提出、という予定にしている。 具体的には、例えば次のような項目から一つ選べば十分である。 • メンデルの実験などの実験結果 R をどこかからか入手し、その実験を計 算機で追試してみる。 • 上記の追試を何回か行い、R よりも誤差が小さくなる回数を数えてみる。 • 上のような実験を行うプログラムの開発,改良。 5 • シミュレーションではなく、R よりも誤差が小さくなる確率を明示的に求 めてみる(C や Mathematica により、確率を求めるプログラムを書く。) • 統計で「χ2 -検定」を習った人は、χ2 -検定を用いて見るのも良い。計算 機実験などよりずっと簡単で効率が良い(ことが多い)。 が、サンプルサイズが小さいとき(カイコの実験例など)では有効でな いことがある。 • もっと根源的な考察。たとえば、種子のレベルでは正確に 1:3 になるモ デルもありうる。我々のシミュレーションのモデルが間違っている可能 性を考え、メンデルの実験結果が実は偽造ではなくなるようなモデルを 構築し、計算機 and/or 数学を用いてそのモデルにおけるメンデルの結果 の妥当性を示せ。 5 授業の進め方 受講生の間で、計算機に対する習熟度に大きな差があると考えられる。授業 は「プログラムを自分で組んだことのない学生」のレベルに合わせて行われる ので、プログラム経験のある学生にとっては意味がほとんどない。 そこで、プログラム経験のある学生は、課題の内容を理解したらあとは勝手 にプログラムをしたりネットを調べたりして研究課題を遂行して欲しい。例え ば僕は、「卵細胞が減数分裂後に全部生き残る」というモデルを立てた場合、 メンデルの実験結果が偽造であるという話が覆されるのではないかと期待して いる。 もし、えんどう豆で生物学的な追試を行いこのような仮説が検証されたら、 「メンデル偽造疑惑は濡れ衣であった」というインパクトのある研究となりうる。 一方、プログラミング経験のない学生向けに、ダウンロード可能な C のコー ドをいくつか用意した。ので、いじって慣れて欲しい。 6 メンデルの実験をシミュレートするプログラム 6.1 homepage 以下のページからプログラムがたぐりよせられます。 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/TEACH/CAM/cam.html 6 6.2 C のコード mendel.c のコード #include <stdio.h> int main(void) { int x,i; int occur[2]={0,0}; printf("input seed>"); scanf("%d",&x); srand(x); for (i=0; i<10000; i++) { if (rand() % 4 == 0) {occur[0]++;} else {occur[1]++;} } printf("(inferior,superior)=%8d, %8d\n", occur[0], occur[1]) ; } 6.3 実行のしかた 1. エディタを開く 2. ホームページからプログラムをコピー・ペーストして、mendel.c という ファイルとして保存する 3. シェルから gcc mendel.c を実行する 4. ./a.out を実行する 5. 初期値を入力する 6. シミュレーションの結果が出る 6.4 実行例 [matumoto@localhost MENDEL]$ ls mendel.c [matumoto@localhost MENDEL]$ gcc mendel.c [matumoto@localhost MENDEL]$ ls 7 a.out mendel.c [matumoto@localhost MENDEL]$ ./a.out input seed>3 (inferior,superior)= 2540, 7460 [matumoto@localhost MENDEL]$ ./a.out input seed>5 (inferior,superior)= 2456, 7544 [matumoto@localhost MENDEL]$ 6.5 いじくってみる 1. 10000 を 1000 とかにすると何が起きるか? 2. 1:3:3:9 で実験するにはどうすればいいか? (mendel2.c) 3. 実験を自動的に 10 回繰り返すにはどうすればいいか? (mendel3.c) 4. どうすれば、メンデルの実験ができすぎかどうか判定できるか? mendel2.c のコード #include <stdio.h> int main(void) { int x,i; int occur[4]={0,0,0,0}; printf("input seed>"); scanf("%d",&x); srand(x); for (i=0; i<10000; i++) { int y; y = rand(); if (y % 16 == 0) {occur[0]++;} else if (y % 16 < 4) {occur[1]++;} else if (y % 16 < 7) {occur[2]++;} else {occur[3]++;} } printf("%8d:%8d:%8d:%8d\n", occur[0], occur[1], occur[2], occur[3]) ; } 8 mendel3.c のコード #include <stdio.h> int main(void) { int x,i,j; int occur[2]={0,0}; printf("input seed>"); scanf("%d",&x); srand(x); for (j=0; j<10; j++) { occur[0]=0; occur[1]=0; for (i=0; i<10000; i++) { if (rand() % 4 == 0) {occur[0]++;} else {occur[1]++;} } printf("(inferior,superior)=%8d, %8d\n", occur[0], occur[1]) ; } } 7 メンデルの実験ができすぎか?のシミュレーション 以下のプログラムも、上述のページからたぐりよせられる。 7.1 C のコード testmendel.c のコード #include <stdio.h> double gosa(a,b) int a, b; { return (fabs(a-((double) a+b)/4)); } 9 int main(void) { int x,y,z,i,j; int occur[2]; int lessn, moren; printf("input seed>"); scanf("%d",&x); srand(x); printf("input (inferior,superior)\n"); printf("number of inf>"); scanf("%d", &y); printf("number of sup>"); scanf("%d", &z); lessn = 0; moren = 0; for (j=0; j<1000; j++) { occur[0]=0; occur[1]=0; for (i=0; i<y+z; i++) { if (rand() % 4 == 0) {occur[0]++;} else {occur[1]++;} } if (gosa(y,z) <= gosa(occur[0],occur[1])) { moren ++; } else { lessn ++; }; } printf("(lessn,moren)=%8d, %8d\n", lessn, moren) ; } 7.2 実行のしかた 1. ネットスケープなどを開く 10 2. ホームページからプログラムを探し、 「セーブ」して testmendel.c という ファイルとして保存する 3. マウスボタン右クリックで kterm を立ち上げる 4. kterm の中から gcc testmendel.c を実行する 5. ./a.out を実行する 6. 初期値を入力する 7. 劣性遺伝の観察個数、優性遺伝の観察個数を入力する 8. 1000 回シミュレーションを繰り返し、7 で入力した結果より誤差が小さ いシミュレーション結果の回数を lessn, 大きい回数を moren として出力 する。 7.3 実行例 [matumoto@localhost MENDEL]$ gcc testmendel.c testmendel.c: In function ‘gosa’: testmendel.c:6: warning: type mismatch in implicit declaration for built-in function ‘fabs’ [matumoto@localhost MENDEL]$ ./a.out input seed>3 input (inferior,superior) number of inf>2001 number of sup>6022 (lessn,moren)= 94, 906 [matumoto@localhost MENDEL]$ これは、メンデルの実験のうち、 「劣性 2001、優性 6022 本」という実験を 1000 回計算機追試してみると、メンデル以上に 1:3 に近い値を得た回数はわずか 94 回であったことを示している。 7.4 いじくってみる 1. カイコの例の「13:42」はできすぎか? 2. 「18:37」は、実験に問題があったと言えるか? 11 3. 「1:3:3:9」に対して上の手法を行うにはどうすれば良いか? 4. カイコの例の「1:2:1:3:6:3≈2:5:2:8:17:6」に対してはどうすれば良いか?(testkaiko.c 下のコード) #include <stdio.h> #include <stdlib.h> #define N 6 double gosa(int a[], double b[]) { int i; double res; res = 0; for (i=0; i<N; i++) { res = res + fabs(((double) a[i])-b[i]); } return (res); } int main(void) { int x,i,j,k, total_life, denomi; int occur[N]; int res_to_test[N]={2, 5, 2, 8, 17, 6}; double prob_ratio[N] = {1, 2, 1, 3, 6, 3}; double prob_list[N]; double prob_dist[N] = {0,0,0,0,0,0}; double ideal[N]; int lessn, moren; printf("input seed>"); scanf("%d",&x); srand(x); total_life = 0; for (i=0; i<N; i++) total_life += res_to_test[i]; 12 denomi = 0; for (i=0; i<N; i++) denomi += prob_ratio[i]; prob_list[0] = prob_ratio[0]/denomi; ideal[0] = prob_list[0] * total_life; for (i=1; i<N; i++) { prob_list[i] = prob_list[i-1] + (prob_ratio[i]/denomi); ideal[i] = (prob_ratio[i]/denomi) * total_life; } /* for (i=0; i<N; i++) { printf("prob_list[%d]=%6f\n",i,prob_list[i]); } */ lessn = 0; moren = 0; for (j=0; j<1000; j++) { for (k=0; k< N; k++) occur[k]=0; for (i=0; i<total_life; i++) { double ran; ran = ((double) rand())/RAND_MAX; for (k=0; k<N; k++) { if (ran < prob_list[k]) { occur[k]++; break; } } } /* printf("occur="); for (k=0; k<N ; k++) { printf("=%3d, ", occur[k]); } printf("\n"); 13 */ if (gosa(res_to_test, ideal) <= gosa(occur, ideal)) { moren ++; } else { lessn ++; } } printf("(lessn,moren)=%8d, %8d\n", lessn, moren) ; } 7.5 testkaiko.c の実行例 [matumoto@localhost MENDEL]$ gcc testkaiko.c testkaiko.c: In function ‘gosa’: testkaiko.c:12: warning: type mismatch in implicit declaration for built-in function ‘fabs’ [matumoto@localhost MENDEL]$ ./a.out input seed>3 (lessn,moren)= 20, 980 [matumoto@localhost MENDEL]$ これは、「2:5:2:8:17:6」なる比よりも理論値に近いような実験結果を得た回数 が、1000 回の追試のうち 20 回だったことを意味している。 参考文献 [1] Fisher, R. A. (1936) Has Mendel’s work been rediscovered? Annals of Science 1, 115-137. [2] Rao, C. R. 邦訳: 統計学とは何か・偶然を生かす, 丸善、1993、藤越康祝 他訳 14
© Copyright 2024 Paperzz