簡體   English   中英

在 Google 表格或 Excel 中計算加權平均值的權重

[英]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)

可能的方法:

  1. Excel 或表格中的求解器
  2. 類似於此StackOverflow討論中的線性優化函數的方法
  3. 本質上,我正在考慮的解決方案使猜測過程自動化(通過線性回歸或其他機制)

我試圖在 Excel 中使用 Solver 進行設置,但我不確定是否可以設置它來解決這個問題,或者我不熟悉也可以在貢獻的工作表中使用的求解器。

預先感謝您的任何幫助。 數據集在此工作中共享

您可以使用 Google Apps 腳本並導入nerdamer庫。 請參閱下面的設置:

設置:

  1. 創建包含這些庫的單獨 gs 文件。

注意:請按照順序操作,否則您會遇到錯誤

命令

  1. 使用下面的腳本:
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);
}

樣本數據:

樣本

輸出:

輸出

筆記:

  • 您可以在輸出范圍中添加偏移量,這樣它就不會覆蓋您的列。
  • 准備多個庫會減慢執行速度,因此可能需要一段時間,但應該需要大約 5 秒才能完成(使用 4 列/變量數據)

編輯:

  • 如果您不想使用外部庫,可以使用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))
    });
}

輸出:

輸出

筆記:

  • 這種方法的缺點是您需要聲明權重的范圍,以及其他變量,例如每個權重的系數等。上面的代碼假設所有權重都在 0 - 100 之間。
  • 線性優化服務上的代碼僅記錄數據,您可以將其修改為自定義函數,或者直接將其寫入工作表。

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM