{"id":15069887,"url":"https://github.com/stdlib-js/stats-chi2gof","last_synced_at":"2025-04-10T17:05:17.278Z","repository":{"id":42644786,"uuid":"377266367","full_name":"stdlib-js/stats-chi2gof","owner":"stdlib-js","description":"Perform a chi-square goodness-of-fit test.","archived":false,"fork":false,"pushed_at":"2024-07-31T13:15:15.000Z","size":5250,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-02T18:51:09.970Z","etag":null,"topics":["goodness-of-fit","hypothesis","javascript","math","mathematics","node","node-js","nodejs","statistics","stats","stdlib","summary","test"],"latest_commit_sha":null,"homepage":"https://github.com/stdlib-js/stdlib","language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stdlib-js.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["stdlib-js"],"open_collective":"stdlib","tidelift":"npm/@stdlib/stdlib"}},"created_at":"2021-06-15T18:58:54.000Z","updated_at":"2024-07-31T13:13:33.000Z","dependencies_parsed_at":"2024-01-23T21:38:44.954Z","dependency_job_id":"27d6dfb3-e429-45c1-a471-d1343004c936","html_url":"https://github.com/stdlib-js/stats-chi2gof","commit_stats":{"total_commits":53,"total_committers":1,"mean_commits":53.0,"dds":0.0,"last_synced_commit":"4762014fc9531ca5815fce340429acd7119e92e4"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stdlib-js%2Fstats-chi2gof","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stdlib-js%2Fstats-chi2gof/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stdlib-js%2Fstats-chi2gof/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stdlib-js%2Fstats-chi2gof/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stdlib-js","download_url":"https://codeload.github.com/stdlib-js/stats-chi2gof/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248260211,"owners_count":21074207,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["goodness-of-fit","hypothesis","javascript","math","mathematics","node","node-js","nodejs","statistics","stats","stdlib","summary","test"],"created_at":"2024-09-25T01:45:21.271Z","updated_at":"2025-04-10T17:05:17.269Z","avatar_url":"https://github.com/stdlib-js.png","language":"JavaScript","funding_links":["https://github.com/sponsors/stdlib-js","https://opencollective.com/stdlib","https://tidelift.com/funding/github/npm/@stdlib/stdlib"],"categories":[],"sub_categories":[],"readme":"\u003c!--\n\n@license Apache-2.0\n\nCopyright (c) 2018 The Stdlib Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n--\u003e\n\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    About stdlib...\n  \u003c/summary\u003e\n  \u003cp\u003eWe believe in a future in which the web is a preferred environment for numerical computation. To help realize this future, we've built stdlib. stdlib is a standard library, with an emphasis on numerical and scientific computation, written in JavaScript (and C) for execution in browsers and in Node.js.\u003c/p\u003e\n  \u003cp\u003eThe library is fully decomposable, being architected in such a way that you can swap out and mix and match APIs and functionality to cater to your exact preferences and use cases.\u003c/p\u003e\n  \u003cp\u003eWhen you use stdlib, you can be absolutely certain that you are using the most thorough, rigorous, well-written, studied, documented, tested, measured, and high-quality code out there.\u003c/p\u003e\n  \u003cp\u003eTo join us in bringing numerical computing to the web, get started by checking us out on \u003ca href=\"https://github.com/stdlib-js/stdlib\"\u003eGitHub\u003c/a\u003e, and please consider \u003ca href=\"https://opencollective.com/stdlib\"\u003efinancially supporting stdlib\u003c/a\u003e. We greatly appreciate your continued support!\u003c/p\u003e\n\u003c/details\u003e\n\n# Chi-square goodness-of-fit test\n\n[![NPM version][npm-image]][npm-url] [![Build Status][test-image]][test-url] [![Coverage Status][coverage-image]][coverage-url] \u003c!-- [![dependencies][dependencies-image]][dependencies-url] --\u003e\n\n\u003e Perform a chi-square goodness-of-fit test.\n\n\u003csection class=\"installation\"\u003e\n\n## Installation\n\n```bash\nnpm install @stdlib/stats-chi2gof\n```\n\nAlternatively,\n\n-   To load the package in a website via a `script` tag without installation and bundlers, use the [ES Module][es-module] available on the [`esm`][esm-url] branch (see [README][esm-readme]).\n-   If you are using Deno, visit the [`deno`][deno-url] branch (see [README][deno-readme] for usage intructions).\n-   For use in Observable, or in browser/node environments, use the [Universal Module Definition (UMD)][umd] build available on the [`umd`][umd-url] branch (see [README][umd-readme]).\n\nThe [branches.md][branches-url] file summarizes the available branches and displays a diagram illustrating their relationships.\n\nTo view installation and usage instructions specific to each branch build, be sure to explicitly navigate to the respective README files on each branch, as linked to above.\n\n\u003c/section\u003e\n\n\u003csection class=\"usage\"\u003e\n\n## Usage\n\n```javascript\nvar chi2gof = require( '@stdlib/stats-chi2gof' );\n```\n\n#### chi2gof( x, y\\[, ...args]\\[, options] )\n\nComputes a chi-square goodness-of-fit test for the **null hypothesis** that the values of `x` come from the discrete probability distribution specified by `y`.\n\n```javascript\n// Observed counts:\nvar x = [ 30, 20, 23, 27 ];\n\n// Expected counts:\nvar y = [ 25, 25, 25, 25 ];\n\nvar res = chi2gof( x, y );\nvar o = res.toJSON();\n/* returns\n    {\n        'rejected': false,\n        'alpha': 0.05,\n        'pValue': ~0.5087,\n        'df': 3,\n        'statistic': ~2.32,\n        ...\n    }\n*/\n```\n\nThe second argument can either be an array-like object (or 1-dimensional [`ndarray`][@stdlib/ndarray/array]) of expected frequencies, an array-like object (or 1-dimensional [`ndarray`][@stdlib/ndarray/array]) of population probabilities summing to one, or a discrete probability distribution name to test against.\n\n```javascript\n// Observed counts:\nvar x = [ 89, 37, 30, 28, 2 ];\n\n// Expected probabilities:\nvar y = [ 0.40, 0.20, 0.20, 0.15, 0.05 ];\n\nvar res = chi2gof( x, y );\nvar o = res.toJSON();\n/* returns\n    {\n        'rejected': true,\n        'alpha': 0.05,\n        'pValue': ~0.0187,\n        'df': 3,\n        'statistic': ~9.9901,\n        ...\n    }\n*/\n```\n\nWhen specifying a discrete probability distribution name, distribution parameters **must** be provided as additional arguments.\n\n```javascript\nvar Int32Array = require( '@stdlib/array-int32' );\nvar discreteUniform = require( '@stdlib/random-base-discrete-uniform' );\n\nvar res;\nvar x;\nvar v;\nvar i;\n\n// Simulate expected counts...\nx = new Int32Array( 100 );\nfor ( i = 0; i \u003c x.length; i++ ) {\n    v = discreteUniform( 0, 99 );\n    x[ v ] += 1;\n}\n\nres = chi2gof( x, 'discrete-uniform', 0, 99 );\n// returns {...}\n```\n\nThe function accepts the following `options`:\n\n-   **alpha**: significance level of the hypothesis test. Must be on the interval `[0,1]`. Default: `0.05`.\n-   **ddof**: \"delta degrees of freedom\" adjustment. Must be a nonnegative integer. Default: `0`.\n-   **simulate**: `boolean` indicating whether to calculate p-values by Monte Carlo simulation. Default: `false`.\n-   **iterations**: number of Monte Carlo iterations. Default: `500`.\n\nBy default, the test is performed at a significance level of `0.05`. To adjust the significance level, set the `alpha` option.\n\n```javascript\nvar x = [ 89, 37, 30, 28, 2 ];\nvar p = [ 0.40, 0.20, 0.20, 0.15, 0.05 ];\n\nvar res = chi2gof( x, p );\n\nvar table = res.toString();\n/* e.g., returns\n\n    Chi-square goodness-of-fit test\n\n    Null hypothesis: population probabilities are equal to those in p\n\n        pValue: 0.0186\n        statistic: 9.9901\n        degrees of freedom: 3\n\n    Test Decision: Reject null in favor of alternative at 5% significance level\n\n*/\n\nres = chi2gof( x, p, {\n    'alpha': 0.01\n});\n\ntable = res.toString();\n/* e.g., returns\n\n    Chi-square goodness-of-fit test\n\n    Null hypothesis: population probabilities are equal to those in p\n\n        pValue: 0.0186\n        statistic: 9.9901\n        degrees of freedom: 3\n\n    Test Decision: Fail to reject null in favor of alternative at 1% significance level\n\n*/\n```\n\nBy default, the p-value is computed using a chi-square distribution with `k-1` degrees of freedom, where `k` is the length of `x`. If provided distribution arguments are estimated (e.g., via maximum likelihood estimation), the degrees of freedom **should** be corrected. Set the `ddof` option to use `k-1-n` degrees of freedom, where `n` is the degrees of freedom adjustment.\n\n```javascript\nvar x = [ 89, 37, 30, 28, 2 ];\nvar p = [ 0.40, 0.20, 0.20, 0.15, 0.05 ];\n\nvar res = chi2gof( x, p, {\n    'ddof': 1\n});\n\nvar o = res.toJSON();\n// returns { 'pValue': ~0.0186, 'statistic': ~9.9901, 'df': 3, ... }\n```\n\nInstead of relying on chi-square approximation to calculate the p-value, one can use Monte Carlo simulation. When the `simulate` option is `true`, the simulation is performed by re-sampling from the discrete probability distribution specified by `y`.\n\n```javascript\nvar x = [ 89, 37, 30, 28, 2 ];\nvar p = [ 0.40, 0.20, 0.20, 0.15, 0.05 ];\n\nvar res = chi2gof( x, p, {\n    'simulate': true,\n    'iterations': 1000 // explicitly set the number of Monte Carlo simulations\n});\n// returns {...}\n```\n\nThe function returns a results `object` having the following properties:\n\n-   **alpha**: significance level.\n-   **rejected**: `boolean` indicating the test decision.\n-   **pValue**: test p-value.\n-   **statistic**: test statistic.\n-   **df**: degrees of freedom.\n-   **method**: test name.\n-   **toString**: serializes results as formatted test output.\n-   **toJSON**: serializes results as a JSON object.\n\nTo print formatted test output, invoke the `toString` method. The method accepts the following options:\n\n-   **digits**: number of displayed decimal digits. Default: `4`.\n-   **decision**: `boolean` indicating whether to show the test decision. Default: `true`.\n\n```javascript\nvar x = [ 89, 37, 30, 28, 2 ];\nvar p = [ 0.40, 0.20, 0.20, 0.15, 0.05 ];\n\nvar res = chi2gof( x, p );\n\nvar table = res.toString({\n    'decision': false\n});\n/* e.g., returns\n\n    Chi-square goodness-of-fit test\n\n    Null hypothesis: population probabilities are equal to those in p\n\n        pValue: 0.0186\n        statistic: 9.9901\n        degrees of freedom: 3\n\n*/\n```\n\n\u003c/section\u003e\n\n\u003c!-- /.usage --\u003e\n\n\u003csection class=\"notes\"\u003e\n\n## Notes\n\n-   The chi-square approximation may be incorrect if the observed or expected frequencies in each category are too small. Common practice is to require frequencies **greater than** five.\n\n\u003c/section\u003e\n\n\u003c!-- /.notes --\u003e\n\n\u003csection class=\"examples\"\u003e\n\n## Examples\n\n\u003c!-- eslint no-undef: \"error\" --\u003e\n\n```javascript\nvar poisson = require( '@stdlib/random-base-poisson' );\nvar Int32Array = require( '@stdlib/array-int32' );\nvar chi2gof = require( '@stdlib/stats-chi2gof' );\n\nvar N = 400;\nvar lambda = 3.0;\nvar rpois = poisson.factory( lambda );\n\n// Draw samples from a Poisson distribution:\nvar x = [];\nvar i;\nfor ( i = 0; i \u003c N; i++ ) {\n    x.push( rpois() );\n}\n\n// Generate a frequency table:\nvar freqs = new Int32Array( N );\nfor ( i = 0; i \u003c N; i++ ) {\n    freqs[ x[ i ] ] += 1;\n}\n\n// Assess whether the simulated values come from a Poisson distribution:\nvar out = chi2gof( freqs, 'poisson', lambda );\n// returns {...}\n\nconsole.log( out.toString() );\n```\n\n\u003c/section\u003e\n\n\u003c!-- /.examples --\u003e\n\n\u003c!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. --\u003e\n\n\u003csection class=\"related\"\u003e\n\n\u003c/section\u003e\n\n\u003c!-- /.related --\u003e\n\n\u003c!-- Section for all links. Make sure to keep an empty line after the `section` element and another before the `/section` close. --\u003e\n\n\n\u003csection class=\"main-repo\" \u003e\n\n* * *\n\n## Notice\n\nThis package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more.\n\nFor more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib].\n\n#### Community\n\n[![Chat][chat-image]][chat-url]\n\n---\n\n## License\n\nSee [LICENSE][stdlib-license].\n\n\n## Copyright\n\nCopyright \u0026copy; 2016-2025. The Stdlib [Authors][stdlib-authors].\n\n\u003c/section\u003e\n\n\u003c!-- /.stdlib --\u003e\n\n\u003c!-- Section for all links. Make sure to keep an empty line after the `section` element and another before the `/section` close. --\u003e\n\n\u003csection class=\"links\"\u003e\n\n[npm-image]: http://img.shields.io/npm/v/@stdlib/stats-chi2gof.svg\n[npm-url]: https://npmjs.org/package/@stdlib/stats-chi2gof\n\n[test-image]: https://github.com/stdlib-js/stats-chi2gof/actions/workflows/test.yml/badge.svg?branch=main\n[test-url]: https://github.com/stdlib-js/stats-chi2gof/actions/workflows/test.yml?query=branch:main\n\n[coverage-image]: https://img.shields.io/codecov/c/github/stdlib-js/stats-chi2gof/main.svg\n[coverage-url]: https://codecov.io/github/stdlib-js/stats-chi2gof?branch=main\n\n\u003c!--\n\n[dependencies-image]: https://img.shields.io/david/stdlib-js/stats-chi2gof.svg\n[dependencies-url]: https://david-dm.org/stdlib-js/stats-chi2gof/main\n\n--\u003e\n\n[chat-image]: https://img.shields.io/gitter/room/stdlib-js/stdlib.svg\n[chat-url]: https://app.gitter.im/#/room/#stdlib-js_stdlib:gitter.im\n\n[stdlib]: https://github.com/stdlib-js/stdlib\n\n[stdlib-authors]: https://github.com/stdlib-js/stdlib/graphs/contributors\n\n[umd]: https://github.com/umdjs/umd\n[es-module]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules\n\n[deno-url]: https://github.com/stdlib-js/stats-chi2gof/tree/deno\n[deno-readme]: https://github.com/stdlib-js/stats-chi2gof/blob/deno/README.md\n[umd-url]: https://github.com/stdlib-js/stats-chi2gof/tree/umd\n[umd-readme]: https://github.com/stdlib-js/stats-chi2gof/blob/umd/README.md\n[esm-url]: https://github.com/stdlib-js/stats-chi2gof/tree/esm\n[esm-readme]: https://github.com/stdlib-js/stats-chi2gof/blob/esm/README.md\n[branches-url]: https://github.com/stdlib-js/stats-chi2gof/blob/main/branches.md\n\n[stdlib-license]: https://raw.githubusercontent.com/stdlib-js/stats-chi2gof/main/LICENSE\n\n[@stdlib/ndarray/array]: https://github.com/stdlib-js/ndarray-array\n\n\u003c/section\u003e\n\n\u003c!-- /.links --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstdlib-js%2Fstats-chi2gof","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstdlib-js%2Fstats-chi2gof","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstdlib-js%2Fstats-chi2gof/lists"}