How to build a chi-square distribution table

2024/10/7 4:37:13

I would like to generate a chi-square distribution table in python as a function of the probability level and degree of freedom.

How to calculate the probability, given a known chi-value and degree of freedom, is this:

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

However, what I know is the probability and the degree of freedom. Thus, I would like to compute the corresponding chi-value for a given probability.

The end result should look similar to something like this.

Answer

The value that you want can be computed with the isf (inverse survival function) method of the scipy.stats.chi2 distribution.

This method uses broadcasting, so you can create your table with just a couple lines of code:

In [61]: from scipy.stats import chi2In [62]: p = np.array([0.995, 0.99, 0.975, 0.95, 0.90, 0.10, 0.05, 0.025, 0.01, 0.005])

Make df an array with shape (n, 1), so it broadcasts with p to create a 2-d array of all the pairings:

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

Now just call isf:

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

Tweak the default print options of numpy to create a nicely formatted table:

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

By setting the print options, the output shows only three decimal places, but the actual full values are still in table. E.g.:

In [67]: table[0, 0]
Out[67]: 3.927042222052108e-05In [68]: table[0, 8]
Out[68]: 6.6348966010212171
https://en.xdnf.cn/q/70287.html

Related Q&A

Reset all weights of Keras model

I would like to be able to reset the weights of my entire Keras model so that I do not have to compile it again. Compiling the model is currently the main bottleneck of my code. Here is an example of w…

How to fix NaN or infinity issue for sparse matrix in python?

Im totally new to python. Ive used some code found online and I tried to work on it. So Im creating a text-document-matrix and I want to add some extra features before training a logistic regression mo…

Mutable default argument for a Python namedtuple

I came across a neat way of having namedtuples use default arguments from here.from collections import namedtuple Node = namedtuple(Node, val left right) Node.__new__.__defaults__ = (None, None, None) …

Windows notification with button using python

I need to make a program that alerts me with a windows notification, and I found out that this can be simply done with the following code. I dont care what library I use from win10toast import ToastNo…

numpy IndexError: too many indices for array when indexing matrix with another

I have a matrix a which I create like this:>>> a = np.matrix("1 2 3; 4 5 6; 7 8 9; 10 11 12")I have a matrix labels which I create like this:>>> labels = np.matrix("1;0…

how to use enum in swig with python?

I have a enum declaration as follows:typedef enum mail_ {Out = 0,Int = 1,Spam = 2 } mail;Function:mail status; int fill_mail_data(int i, &status);In the function above, status gets filled up and wi…

What does except Exception as e mean in python? [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.Want to improve this question? Update the question so it focuses on one problem only by editing this post.Closed 4…

Numpy efficient big matrix multiplication

To store big matrix on disk I use numpy.memmap.Here is a sample code to test big matrix multiplication:import numpy as np import timerows= 10000 # it can be large for example 1kk cols= 1000#create some…

Basic parallel python program freezes on Windows

This is the basic Python example from https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool on parallel processingfrom multiprocessing import Pooldef f(x):return x*xif __na…

Formatting multiple worksheets using xlsxwriter

How to copy the same formatting to different sheets of the same Excel file using the xlsxwriter library in Python?The code I tried is: import xlsxwriterimport pandas as pd import numpy as npfrom xlsxw…