-
-
Notifications
You must be signed in to change notification settings - Fork 982
feat: add stats/base/ndarray/dmeanstdev
#8525
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
feat: add stats/base/ndarray/dmeanstdev
#8525
Conversation
Coverage Report
The above coverage report was generated for the changes in this PR. |
|
|
||
| <section class="intro"> | ||
|
|
||
| The [arithmetic mean][arithmetic-mean] and [standard deviation][standard-deviation] are defined as |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should just copy the introduction from stats/strided/dmeanstdev instead of rolling your own. This makes find-and-replace easier when we are consistent in our docs across similar packages.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This comment still needs to be addressed.
| function dmeanstdev( arrays ) { | ||
| var out = arrays[ 1 ]; | ||
| var x = arrays[ 0 ]; | ||
| return strided( numelDimension( x, 0 ), 1, getData( x ), getStride( x, 0 ), getOffset( x ), getData( out ), getStride( out, 0 ), getOffset( out ) ); // eslint-disable-line max-len |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not what is desired. For a much more complicated API, see https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/stats/base/ndarray/dztest. Notice there that scalar parameters, such as should be done for correction, are provided as ancillary arrays. Hardcoding 1 for the correction is not what we want.
lib/node_modules/@stdlib/stats/base/ndarray/dmeanstdev/README.md
Outdated
Show resolved
Hide resolved
lib/node_modules/@stdlib/stats/base/ndarray/dmeanstdev/README.md
Outdated
Show resolved
Hide resolved
lib/node_modules/@stdlib/stats/base/ndarray/dmeanstdev/README.md
Outdated
Show resolved
Hide resolved
kgryte
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Left some initial comments.
Co-authored-by: Athan <kgryte@gmail.com> Signed-off-by: Sachin Pangal <151670745+Orthodox-64@users.noreply.github.com>
Co-authored-by: Athan <kgryte@gmail.com> Signed-off-by: Sachin Pangal <151670745+Orthodox-64@users.noreply.github.com>
Co-authored-by: Athan <kgryte@gmail.com> Signed-off-by: Sachin Pangal <151670745+Orthodox-64@users.noreply.github.com>
|
@kgryte Done — I’ve applied all the requested changes. |
lib/node_modules/@stdlib/stats/base/ndarray/dmeanstdev/docs/types/index.d.ts
Show resolved
Hide resolved
|
@kgryte Done with the above changes!. |
Signed-off-by: Athan <kgryte@gmail.com>
| - **arrays**: array-like object containing the following ndarrays in order: | ||
|
|
||
| 1. a one-dimensional input ndarray. | ||
| 2. a one-dimensional output ndarray (of length 2) to store the [mean][arithmetic-mean] and [standard deviation][standard-deviation]. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| 2. a one-dimensional output ndarray (of length 2) to store the [mean][arithmetic-mean] and [standard deviation][standard-deviation]. | |
| 2. a one-dimensional output ndarray to store the [mean][arithmetic-mean] and [standard deviation][standard-deviation]. |
|
|
||
| 1. a one-dimensional input ndarray. | ||
| 2. a one-dimensional output ndarray (of length 2) to store the [mean][arithmetic-mean] and [standard deviation][standard-deviation]. | ||
| 3. a zero-dimensional ndarray specifying the degrees of freedom adjustment. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| 3. a zero-dimensional ndarray specifying the degrees of freedom adjustment. | |
| 3. a zero-dimensional ndarray specifying the degrees of freedom adjustment. Setting this to a value other than `0` has the effect of adjusting the divisor during the calculation of the [standard deviation][standard-deviation] according to `N-c` where `c` corresponds to the provided degrees of freedom adjustment. When computing the [standard deviation][standard-deviation] of a population, setting this to `0` is the standard choice (i.e., the provided array contains data constituting an entire population). When computing the corrected sample [standard deviation][standard-deviation], setting this to `1` is the standard choice (i.e., the provided array contains data sampled from a larger population; this is commonly referred to as Bessel's correction). |
| The output ndarray contains two elements: the [arithmetic mean][arithmetic-mean] at index 0 and the [standard deviation][standard-deviation] at index 1. The [standard deviation][standard-deviation] is computed using the provided degrees of freedom adjustment. Setting the correction parameter to `1` corresponds to Bessel's correction (i.e., the corrected sample standard deviation). Setting it to `0` computes the population standard deviation. | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| The output ndarray contains two elements: the [arithmetic mean][arithmetic-mean] at index 0 and the [standard deviation][standard-deviation] at index 1. The [standard deviation][standard-deviation] is computed using the provided degrees of freedom adjustment. Setting the correction parameter to `1` corresponds to Bessel's correction (i.e., the corrected sample standard deviation). Setting it to `0` computes the population standard deviation. |
|
|
||
| ## Notes | ||
|
|
||
| - If provided an empty one-dimensional ndarray, the computed [arithmetic mean][arithmetic-mean] and [standard deviation][standard-deviation] are equal to `NaN`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| - If provided an empty one-dimensional ndarray, the computed [arithmetic mean][arithmetic-mean] and [standard deviation][standard-deviation] are equal to `NaN`. | |
| - If provided an empty one-dimensional ndarray, the computed [arithmetic mean][arithmetic-mean] and [standard deviation][standard-deviation] are equal to `NaN`. | |
| - If `N - c` is less than or equal to `0` (where `c` corresponds to the provided degrees of freedom adjustment), the computed [arithmetic mean][arithmetic-mean] and [standard deviation][standard-deviation] are equal to `NaN`. |
|
|
||
| var correction = scalar2ndarray( 1.0, opts ); | ||
|
|
||
| var v = dmeanstdev( [ x, out, correction ] ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should be able to use ndarray2array to display the (approximate) results.
|
|
||
| xbuf = uniform( len, -10.0, 10.0, options ); | ||
| x = new ndarray( options.dtype, xbuf, [ len ], [ 1 ], 0, 'row-major' ); | ||
| out = new ndarray( 'float64', new Float64Array( 2 ), [ 2 ], [ 1 ], 0, 'row-major' ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rather than hardcoding float64 here, I suggest using ndarray/base/zeros.
| b.tic(); | ||
| for ( i = 0; i < b.iterations; i++ ) { | ||
| v = dmeanstdev( [ x, out, correction ] ); | ||
| if ( isnan( v[ 0 ] ) ) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not correct. v[ 0 ] is undefined.
| } | ||
| } | ||
| b.toc(); | ||
| if ( isnan( v[ 0 ] ) ) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same comment.
| - a one-dimensional output ndarray (of length 2) to store the mean | ||
| and standard deviation. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| - a one-dimensional output ndarray (of length 2) to store the mean | |
| and standard deviation. | |
| - a one-dimensional output ndarray to store the mean | |
| and standard deviation. |
| - a one-dimensional input ndarray. | ||
| - a one-dimensional output ndarray (of length 2) to store the mean | ||
| and standard deviation. | ||
| - a zero-dimensional ndarray specifying the degrees of freedom |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You need a longer description here. See README suggestion.
| > var opts = { 'dtype': dt }; | ||
| > var correction = {{alias:@stdlib/ndarray/from-scalar}}( 1.0, opts ); | ||
| > {{alias}}( [ x, out, correction ] ); | ||
| > {{alias:@stdlib/ndarray/to-array}}( out ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is precisely the sort of thing you can do in that README example. Namely, use ndarray/to-array to convert the output ndarray to a nested array and then show approximate results as done on the next line.
| /** | ||
| * Computes the mean and standard deviation of a one-dimensional double-precision floating-point ndarray. | ||
| * | ||
| * @param arrays - array-like object containing input and output ndarrays, and a correction parameter ndarray |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| * @param arrays - array-like object containing input and output ndarrays, and a correction parameter ndarray | |
| * @param arrays - array-like object containing an input ndarray, an output ndarray, and ndarray containing the degrees of freedom adjustment |
| * Computes the mean and standard deviation of a one-dimensional double-precision floating-point ndarray. | ||
| * | ||
| * @param arrays - array-like object containing input and output ndarrays, and a correction parameter ndarray | ||
| * @returns output ndarray containing [ mean, stdev ] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| * @returns output ndarray containing [ mean, stdev ] | |
| * @returns output ndarray |
| * | ||
| * var arr = ndarray2array( v ); | ||
| * // returns <Float64Array>[ ~1.25, ~2.5 ] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And this is even closer to what we want in the README example.
|
|
||
| dmeanstdev(); // $ExpectError | ||
| dmeanstdev( [ x, out ] ); // $ExpectError | ||
| dmeanstdev( [ x, out, correction, correction ] ); // $ExpectError |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| dmeanstdev( [ x, out, correction, correction ] ); // $ExpectError | |
| dmeanstdev( [ x, out, correction, correction ] ); // $ExpectError | |
| dmeanstdev( [ x, out, correction ], {} ); // $ExpectError |
| var xbuf = discreteUniform( 10, -50, 50, { | ||
| 'dtype': 'float64' | ||
| }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| var xbuf = discreteUniform( 10, -50, 50, { | |
| 'dtype': 'float64' | |
| }); | |
| var xbuf = discreteUniform( 10, -50, 50, opts ); |
| var xbuf = discreteUniform( 10, -50, 50, { | ||
| 'dtype': 'float64' | ||
| }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| var xbuf = discreteUniform( 10, -50, 50, { | |
| 'dtype': 'float64' | |
| }); | |
| var xbuf = discreteUniform( 10, -50, 50, opts ); |
| t.end(); | ||
| }); | ||
|
|
||
| tape( 'if provided an empty vector, the function returns `NaN` values', function test( t ) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| tape( 'if provided an empty vector, the function returns `NaN` values', function test( t ) { | |
| tape( 'if provided an empty ndarray, the function returns `NaN` values', function test( t ) { |
| * limitations under the License. | ||
| */ | ||
|
|
||
| 'use strict'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| 'use strict'; | |
| /* eslint-disable max-len */ | |
| 'use strict'; |
| t.end(); | ||
| }); | ||
|
|
||
| tape( 'if provided a vector containing a single element, the function returns that element as mean and `NaN` as standard deviation when using sample correction', function test( t ) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| tape( 'if provided a vector containing a single element, the function returns that element as mean and `NaN` as standard deviation when using sample correction', function test( t ) { | |
| tape( 'if provided a correction value yielding `N-correction` less than or equal to `0`, the function returns a standard deviation equal to `NaN`', function test( t ) { |
kgryte
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Left another round of comments.
type: pre_commit_static_analysis_report
description: Results of running static analysis checks when committing changes. report:
Resolves None.
Description
This pull request:
Related Issues
This pull request has the following related issues:
Questions
No.
Other
No.
Checklist
AI Assistance
If you answered "yes" above, how did you use AI assistance?
Disclosure
{{TODO: add disclosure if applicable}}
@stdlib-js/reviewers