python - 如何建立卡方分布表

标签 python numpy statistics scipy

我想在 python 中生成卡方分布表作为概率水平和自由度的函数。

在给定卡值和自由度的情况下,如何计算概率是这样的:

In[44]: scipy.stats.chisqprob(5.991, 2)
Out[44]: 0.050011615026579088

不过,我知道的是概率和自由度。因此,我想计算给定概率对应的卡值。

最终结果应该类似于 something like this .

最佳答案

可以使用 scipy.stats.chi2isf(逆生存函数)方法计算您想要的值分布。

此方法使用广播,因此您只需几行代码即可创建表格:

In [61]: from scipy.stats import chi2

In [62]: p = np.array([0.995, 0.99, 0.975, 0.95, 0.90, 0.10, 0.05, 0.025, 0.01, 0.005])

使 df 成为形状为 (n, 1) 的数组,因此它使用 p 进行广播以创建一个包含所有元素的二维数组配对:

In [63]: df = np.array(range(1, 30) + range(30, 101, 10)).reshape(-1, 1)

现在调用isf:

In [64]: table = chi2.isf(p, df)

调整 numpy 的默认打印选项以创建格式良好的表格:

In [65]: np.set_printoptions(linewidth=130, formatter=dict(float=lambda x: "%7.3f" % x))

In [66]: table
Out[66]: 
array([[  0.000,   0.000,   0.001,   0.004,   0.016,   2.706,   3.841,   5.024,   6.635,   7.879],
       [  0.010,   0.020,   0.051,   0.103,   0.211,   4.605,   5.991,   7.378,   9.210,  10.597],
       [  0.072,   0.115,   0.216,   0.352,   0.584,   6.251,   7.815,   9.348,  11.345,  12.838],
       [  0.207,   0.297,   0.484,   0.711,   1.064,   7.779,   9.488,  11.143,  13.277,  14.860],
       [  0.412,   0.554,   0.831,   1.145,   1.610,   9.236,  11.070,  12.833,  15.086,  16.750],
       [  0.676,   0.872,   1.237,   1.635,   2.204,  10.645,  12.592,  14.449,  16.812,  18.548],
       [  0.989,   1.239,   1.690,   2.167,   2.833,  12.017,  14.067,  16.013,  18.475,  20.278],
       [  1.344,   1.646,   2.180,   2.733,   3.490,  13.362,  15.507,  17.535,  20.090,  21.955],
       [  1.735,   2.088,   2.700,   3.325,   4.168,  14.684,  16.919,  19.023,  21.666,  23.589],
       [  2.156,   2.558,   3.247,   3.940,   4.865,  15.987,  18.307,  20.483,  23.209,  25.188],
       [  2.603,   3.053,   3.816,   4.575,   5.578,  17.275,  19.675,  21.920,  24.725,  26.757],
       [  3.074,   3.571,   4.404,   5.226,   6.304,  18.549,  21.026,  23.337,  26.217,  28.300],
       [  3.565,   4.107,   5.009,   5.892,   7.042,  19.812,  22.362,  24.736,  27.688,  29.819],
       [  4.075,   4.660,   5.629,   6.571,   7.790,  21.064,  23.685,  26.119,  29.141,  31.319],
       [  4.601,   5.229,   6.262,   7.261,   8.547,  22.307,  24.996,  27.488,  30.578,  32.801],
       [  5.142,   5.812,   6.908,   7.962,   9.312,  23.542,  26.296,  28.845,  32.000,  34.267],
       [  5.697,   6.408,   7.564,   8.672,  10.085,  24.769,  27.587,  30.191,  33.409,  35.718],
       [  6.265,   7.015,   8.231,   9.390,  10.865,  25.989,  28.869,  31.526,  34.805,  37.156],
       [  6.844,   7.633,   8.907,  10.117,  11.651,  27.204,  30.144,  32.852,  36.191,  38.582],
       [  7.434,   8.260,   9.591,  10.851,  12.443,  28.412,  31.410,  34.170,  37.566,  39.997],
       [  8.034,   8.897,  10.283,  11.591,  13.240,  29.615,  32.671,  35.479,  38.932,  41.401],
       [  8.643,   9.542,  10.982,  12.338,  14.041,  30.813,  33.924,  36.781,  40.289,  42.796],
       [  9.260,  10.196,  11.689,  13.091,  14.848,  32.007,  35.172,  38.076,  41.638,  44.181],
       [  9.886,  10.856,  12.401,  13.848,  15.659,  33.196,  36.415,  39.364,  42.980,  45.559],
       [ 10.520,  11.524,  13.120,  14.611,  16.473,  34.382,  37.652,  40.646,  44.314,  46.928],
       [ 11.160,  12.198,  13.844,  15.379,  17.292,  35.563,  38.885,  41.923,  45.642,  48.290],
       [ 11.808,  12.879,  14.573,  16.151,  18.114,  36.741,  40.113,  43.195,  46.963,  49.645],
       [ 12.461,  13.565,  15.308,  16.928,  18.939,  37.916,  41.337,  44.461,  48.278,  50.993],
       [ 13.121,  14.256,  16.047,  17.708,  19.768,  39.087,  42.557,  45.722,  49.588,  52.336],
       [ 13.787,  14.953,  16.791,  18.493,  20.599,  40.256,  43.773,  46.979,  50.892,  53.672],
       [ 20.707,  22.164,  24.433,  26.509,  29.051,  51.805,  55.758,  59.342,  63.691,  66.766],
       [ 27.991,  29.707,  32.357,  34.764,  37.689,  63.167,  67.505,  71.420,  76.154,  79.490],
       [ 35.534,  37.485,  40.482,  43.188,  46.459,  74.397,  79.082,  83.298,  88.379,  91.952],
       [ 43.275,  45.442,  48.758,  51.739,  55.329,  85.527,  90.531,  95.023, 100.425, 104.215],
       [ 51.172,  53.540,  57.153,  60.391,  64.278,  96.578, 101.879, 106.629, 112.329, 116.321],
       [ 59.196,  61.754,  65.647,  69.126,  73.291, 107.565, 113.145, 118.136, 124.116, 128.299],
       [ 67.328,  70.065,  74.222,  77.929,  82.358, 118.498, 124.342, 129.561, 135.807, 140.169]])

通过设置打印选项,输出只显示三位小数,但实际的完整值仍在表中。例如:

In [67]: table[0, 0]
Out[67]: 3.927042222052108e-05

In [68]: table[0, 8]
Out[68]: 6.6348966010212171

关于python - 如何建立卡方分布表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32301698/

相关文章:

matlab - 转移和发射矩阵隐马尔可夫模型 MATLAB 的初步猜测?

php - 加权平均数

python - Django:setup.py install - 访问被拒绝?

python - 如何按日期对条目进行分组并计算百分比

python - 使用 Python 枚举定义 SQLAlchemy 枚举列会引发 "ValueError: not a valid enum"

python - 按值对 numpy 矩阵进行有效着色?

python - 将字典值相乘并输出到 'list type' 的最快方法

python - 使用 numpy.i 和 swig 访问 int16 数组

r - 为什么 r 中关于生成 Gamma 随机变量的代码没有返回预期的输出?

javascript - 使用 Wea​​syprint 生成 pdf 文件,保存为 zip 文件,将该 zip 文件发送给客户端并提供下载