Created
June 1, 2023 15:18
-
-
Save Wybxc/d7973b7b5442ef09c2efe5b45843cb74 to your computer and use it in GitHub Desktop.
双因子方差分析计算器
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 41, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "array([[[15., 15., 17.],\n", | |
| " [19., 19., 16.],\n", | |
| " [16., 18., 21.]],\n", | |
| "\n", | |
| " [[17., 17., 17.],\n", | |
| " [15., 15., 15.],\n", | |
| " [19., 22., 22.]],\n", | |
| "\n", | |
| " [[15., 17., 16.],\n", | |
| " [18., 17., 16.],\n", | |
| " [18., 18., 18.]],\n", | |
| "\n", | |
| " [[18., 20., 22.],\n", | |
| " [15., 16., 17.],\n", | |
| " [17., 17., 17.]]])" | |
| ] | |
| }, | |
| "execution_count": 41, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "import numpy as np\n", | |
| "\n", | |
| "data_raw = \"\"\"\n", | |
| "15,15,17 19,19,16 16,18,21\n", | |
| "17,17,17 15,15,15 19,22,22\n", | |
| "15,17,16 18,17,16 18,18,18\n", | |
| "18,20,22 15,16,17 17,17,17\n", | |
| "\"\"\".strip()\n", | |
| "\n", | |
| "data = np.array([[s.split(\",\") for s in l.split()] for l in data_raw.splitlines()])\n", | |
| "data = np.float64(data)\n", | |
| "data\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 42, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(4, 3, 3)" | |
| ] | |
| }, | |
| "execution_count": 42, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "S, T, R = data.shape\n", | |
| "S, T, R" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 43, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(array([17.33333333, 17.66666667, 17. , 17.66666667]),\n", | |
| " array([17.16666667, 16.5 , 18.58333333]),\n", | |
| " array([[15.66666667, 18. , 18.33333333],\n", | |
| " [17. , 15. , 21. ],\n", | |
| " [16. , 17. , 18. ],\n", | |
| " [20. , 16. , 17. ]]),\n", | |
| " 17.416666666666668)" | |
| ] | |
| }, | |
| "execution_count": 43, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "mu_a = data.mean(axis=(1, 2))\n", | |
| "mu_b = data.mean(axis=(0, 2))\n", | |
| "mu_r = data.mean(axis=2)\n", | |
| "mu = data.mean(axis=(0, 1, 2))\n", | |
| "\n", | |
| "mu_a, mu_b, mu_r, mu\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 44, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "sa=2.7500000000000124, sb=27.16666666666663, sr=41.33333333333333, sab=73.50000000000004, s=144.75\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "sa = ((mu_a - mu) ** 2).sum() * T * R\n", | |
| "sb = ((mu_b - mu) ** 2).sum() * S * R\n", | |
| "sr = ((data - mu_r[:, :, np.newaxis]) ** 2).sum()\n", | |
| "s = ((data - mu) ** 2).sum()\n", | |
| "sab = s - sa - sb - sr\n", | |
| "print(f\"sa={sa}, sb={sb}, sr={sr}, sab={sab}, s={s}\")\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 45, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "na=3, nb=2, nr=24, nab=6, n=35\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "na = S - 1\n", | |
| "nb = T - 1\n", | |
| "nab = (S - 1) * (T - 1)\n", | |
| "nr = S * T * R - 1 - na - nb - nab\n", | |
| "print(f\"na={na}, nb={nb}, nr={nr}, nab={nab}, n={na+nb+nr+nab}\")\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 46, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "fa=0.5322580645161314, fb=7.887096774193538, fab=7.112903225806456\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "if R == 1:\n", | |
| " fa = (sa / na) / (sab / nab)\n", | |
| " fb = (sb / nb) / (sab / nab)\n", | |
| " fab = 0\n", | |
| " print(f\"fa={fa}, fb={fb}\")\n", | |
| "else:\n", | |
| " fa = (sa / na) / (sr / nr)\n", | |
| " fb = (sb / nb) / (sr / nr)\n", | |
| " fab = (sab / nab) / (sr / nr)\n", | |
| " print(f\"fa={fa}, fb={fb}, fab={fab}\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 47, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "pa=0.6645281856425167, pb=0.002329798210769174, pab=0.00019217323641351758\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "from scipy import stats\n", | |
| "\n", | |
| "if R == 1:\n", | |
| " pa = 1 - stats.f.cdf(fa, na, nab)\n", | |
| " pb = 1 - stats.f.cdf(fb, nb, nab)\n", | |
| " print(f\"pa={pa}, pb={pb}\")\n", | |
| "else:\n", | |
| " pa = 1 - stats.f.cdf(fa, na, nr)\n", | |
| " pb = 1 - stats.f.cdf(fb, nb, nr)\n", | |
| " pab = 1 - stats.f.cdf(fab, nab, nr)\n", | |
| " print(f\"pa={pa}, pb={pb}, pab={pab}\")\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 48, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<table>\n", | |
| "<thead>\n", | |
| "<tr><th>方差来源 </th><th style=\"text-align: right;\"> 平方和</th><th style=\"text-align: right;\"> 自由度</th><th>F值 </th><th>显著性 </th></tr>\n", | |
| "</thead>\n", | |
| "<tbody>\n", | |
| "<tr><td>因子A </td><td style=\"text-align: right;\"> 2.75 </td><td style=\"text-align: right;\"> 3</td><td>F(3, 24)=0.532</td><td>p=0.665 </td></tr>\n", | |
| "<tr><td>因子B </td><td style=\"text-align: right;\"> 27.1667</td><td style=\"text-align: right;\"> 2</td><td>F(2, 24)=7.887</td><td>p=0.002 </td></tr>\n", | |
| "<tr><td>交互作用 </td><td style=\"text-align: right;\"> 73.5 </td><td style=\"text-align: right;\"> 6</td><td>F(6, 24)=7.113</td><td>p=0.000 </td></tr>\n", | |
| "<tr><td>误差 </td><td style=\"text-align: right;\"> 41.3333</td><td style=\"text-align: right;\"> 24</td><td> </td><td> </td></tr>\n", | |
| "<tr><td>总和 </td><td style=\"text-align: right;\">144.75 </td><td style=\"text-align: right;\"> 35</td><td> </td><td> </td></tr>\n", | |
| "</tbody>\n", | |
| "</table>" | |
| ], | |
| "text/plain": [ | |
| "<IPython.core.display.HTML object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "from IPython.display import HTML, display\n", | |
| "import tabulate\n", | |
| "\n", | |
| "headers = [\"方差来源\", \"平方和\", \"自由度\", \"F值\", \"显著性\"]\n", | |
| "if R == 1:\n", | |
| " table = [\n", | |
| " [\"因子A\", sa, na, f\"F({na}, {nab})={fa:.3f}\", f\"p={pa:.3f}\"],\n", | |
| " [\"因子B\", sb, nb, f\"F({nb}, {nab})={fb:.3f}\", f\"p={pb:.3f}\"],\n", | |
| " [\"误差\", sab, nab, \"\", \"\"],\n", | |
| " [\"总和\", s, na + nb + nab, \"\", \"\"],\n", | |
| " ]\n", | |
| "else:\n", | |
| " table = [\n", | |
| " [\"因子A\", sa, na, f\"F({na}, {nr})={fa:.3f}\", f\"p={pa:.3f}\"],\n", | |
| " [\"因子B\", sb, nb, f\"F({nb}, {nr})={fb:.3f}\", f\"p={pb:.3f}\"],\n", | |
| " [\"交互作用\", sab, nab, f\"F({nab}, {nr})={fab:.3f}\", f\"p={pab:.3f}\"],\n", | |
| " [\"误差\", sr, nr, \"\", \"\"],\n", | |
| " [\"总和\", s, na + nb + nab + nr, \"\", \"\"],\n", | |
| " ]\n", | |
| "display(HTML(tabulate.tabulate(table, headers=headers, tablefmt=\"html\")))\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "base", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.10.9" | |
| }, | |
| "orig_nbformat": 4 | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment