( xsI: Iterable<number>, ysI: Iterable<number> )
| 369 | export function bigPopulationCovariance( |
| 370 | xs: Iterable<BigDecimal>, |
| 371 | ys: Iterable<BigDecimal> |
| 372 | ): BigDecimal { |
| 373 | return bigCovImpl(xs, ys, true); |
| 374 | } |
| 375 | |
| 376 | export function correlation( |
| 377 | xsI: Iterable<number>, |
| 378 | ysI: Iterable<number> |
| 379 | ): number { |
| 380 | const xs = [...xsI]; |
| 381 | const ys = [...ysI]; |
| 382 | const n = xs.length; |
| 383 | if (n !== ys.length || n < 2) return NaN; |
| 384 | let sx = 0; |
| 385 | let sy = 0; |
| 386 | let sxy = 0; |
| 387 | let sx2 = 0; |
| 388 | let sy2 = 0; |
| 389 | for (let i = 0; i < n; i++) { |
| 390 | sx += xs[i]; |
| 391 | sy += ys[i]; |
| 392 | sxy += xs[i] * ys[i]; |
| 393 | sx2 += xs[i] * xs[i]; |
| 394 | sy2 += ys[i] * ys[i]; |
| 395 | } |
| 396 | const cov = sxy - (sx * sy) / n; |
| 397 | const vx = sx2 - (sx * sx) / n; |
| 398 | const vy = sy2 - (sy * sy) / n; |
| 399 | const d = Math.sqrt(vx * vy); |
| 400 | if (d === 0) return NaN; // zero variance → correlation undefined |
no test coverage detected