Microsoft Excel のGROWTH関数を JavaScript で実装しようとしています。この関数は、既存のデータを使用して予測される指数関数的成長を計算します。扱いにくいのは、複数のknown_x's
値のセットで機能する必要があることです。参照式が見つかりませんでした。助言がありますか?
よろしくお願いします。
Microsoft Excel のGROWTH関数を JavaScript で実装しようとしています。この関数は、既存のデータを使用して予測される指数関数的成長を計算します。扱いにくいのは、複数のknown_x's
値のセットで機能する必要があることです。参照式が見つかりませんでした。助言がありますか?
よろしくお願いします。
math.SE での私の回答とWikipedia ページの単純な線形回帰式に基づいた再実装を次に示します。
function growth ( known_y, known_x, new_x, use_const ) {
// default values for optional parameters:
if ( typeof( known_x ) == 'undefined' ) {
known_x = [];
for ( var i = 1; i <= known_y.length; i++ ) known_x.push(i);
}
if ( typeof( new_x ) == 'undefined' ) {
new_x = [];
for ( var i = 1; i <= known_y.length; i++ ) new_x.push(i);
}
if ( typeof( use_const ) == 'undefined' ) use_const = true;
// calculate sums over the data:
var n = known_y.length;
var avg_x = 0; var avg_y = 0; var avg_xy = 0; var avg_xx = 0;
for ( var i = 0; i < n; i++ ) {
var x = known_x[i]; var y = Math.log( known_y[i] );
avg_x += x; avg_y += y; avg_xy += x*y; avg_xx += x*x;
}
avg_x /= n; avg_y /= n; avg_xy /= n; avg_xx /= n;
// compute linear regression coefficients:
if ( use_const ) {
var beta = (avg_xy - avg_x*avg_y) / (avg_xx - avg_x*avg_x);
var alpha = avg_y - beta*avg_x;
} else {
var beta = avg_xy / avg_xx;
var alpha = 0;
}
// console.log("alpha = " + alpha + ", beta = " + beta);
// compute and return result array:
var new_y = [];
for ( var i = 0; i < new_x.length; i++ ) {
new_y.push( Math.exp( alpha + beta * new_x[i] ) );
}
return new_y;
}
こちらが ideone.com のデモです。出力をExcelGROWTH
ドキュメント ページのデモ ワークシートと比較できます。
アルゴリズムの合計ループの数値的安定性は、ウィキペディアのページで説明されている分散の計算などの手法を使用して改善できることに注意してください。ただし、このような単純な例では、単純な合計ループで十分です。