[英]Figure out the weights of a weighted average in Google Sheets or Excel
表格中此數據集中的分數是使用 B:E 列中 4 個變量的加權平均值計算的。 每條線的加權平均值相同。
給定幾行分數和變量,如何在 Excel 或表格中發現權重?
表中的平均權重函數為:
AVERAGE.WEIGHTED(B2,a,C2,b,D2,c,E2,d)
可能的方法:
我試圖在 Excel 中使用 Solver 進行設置,但我不確定是否可以設置它來解決這個問題,或者我不熟悉也可以在貢獻的工作表中使用的求解器。
預先感謝您的任何幫助。 數據集在此工作表中共享
您可以使用 Google Apps 腳本並導入nerdamer庫。 請參閱下面的設置:
注意:請按照順序操作,否則您會遇到錯誤
function solveWeights() {
// Get data, process, then outputs on the actual column header.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const vars = sheet.getLastColumn() - 1;
let data = sheet.getRange(1, 1, vars + 1, vars + 1).getValues();
let headers = data.shift();
let solution = [nerdamer.solveEquations(data.map(row => {
return `${row[0]}=${row.slice(1).map((x, i) => x + headers[i + 1]).join('+')}`;
})).toString().split(',').filter((_, i) => i % 2 == 1).map((x, i) => `${headers[i + 1]} = ${x}`)]
sheet.getRange(1, 2, solution.length, solution[0].length).setValues(solution);
}
LinearOptimizationService
。 請參閱下面的示例:function solveWeight() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const vars = sheet.getLastColumn() - 1;
// fetch N rows based on how many variables are present
const data = sheet.getRange(1, 1, vars + 1, vars + 1).getValues();
let headers = data.shift();
headers = headers.slice(1);
let engine = LinearOptimizationService.createEngine();
// add variable
headers.forEach(header => {
// set the range of the weights' possible values (e.g. 0 - 100)
engine.addVariable(header, 0, 100);
});
// create constraint
data.forEach(row => {
let sum = row.shift();
let constraint = engine.addConstraint(sum, sum);
// set all values as coefficients
row.forEach((value, index) => {
constraint.setCoefficient(headers[index], value);
});
});
// get lowest possible values
engine.setMinimization();
let solution = engine.solve();
if (!solution.isValid())
Logger.log('No solution: ' + solution.getStatus());
else
headers.forEach(header => {
// workaround due to rounding issue of javascript
console.log(header + ' value is: ' + solution.getVariableValue(header).toFixed(2))
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.