czwartek, października 14, 2010

Regresja liniowa w Google Docs

Na bardzo szybko ;-)

Ostatnio potrzebne mi było policzenie regresji liniowej..
OK, dokładniej chodziło mi o to by przybliżyć pewien zestaw punktów [moją pensję w czasie ;-)] linią.
Z tego co pamiętam w Excelu była taka możliwość, ale Excela nie mam, w OpenOffice.org Calc nie znalazłem [choć nie szukałem jakoś szczególnie], w końcu policzyłem na kalkulatorze :-) [inne rodzaje regresji zresztą też ;-)]
Ale po wszystkim stwierdziłem, że zobaczę sobie czy da się to zrobić w Google Docs :-)

Wprost się chyba nie da, w każdym bądź razie nie znalazłem niczego, ale za to napisałem sobie skrypt :-)

Coby go dodać do naszego arkusza to wybieramy Tools -> Scripts -> Script editor i wklejamy do niego poniższy skrypt.

function linearRegression() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var myValue = Browser.inputBox("Enter a range");
var sumXY = 0.0;
var sumX = 0.0;
var sumY = 0.0;
var sumX2 = 0.0;
var myRange = sheet.getRange(myValue);
var n = myRange.getHeight();
for (var i=0; i<n; i++) {
var xi = myRange.getCell(i+1, 1).getValue();
var yi = myRange.getCell(i+1, 2).getValue();
sumXY+=xi*yi;
sumX+=xi;
sumY+=yi;
sumX2+=xi*xi;
}
var a = (n*sumXY-sumX*sumY)/(n*sumX2-sumX*sumX);
var b = 1/n*(sumY-a*sumX);
Browser.msgBox("a="+a+"\nb="+b);
}


Działanie polega na tym, że po nagraniu i uruchomieniu skryptu [w okienku edytora, jak to się robi bez edytora jeszcze nie wiem, używam tego od 20 minut :-)] podajemy zakres w którym są nasze dane (w postaci w stylu A1:B100). Muszą to być 2 kolumny danych, w pierwszej kolumnie będzie X, w drugiej Y.
Po chwili zobaczymy wyniki, czyli wartość współczynników a i b równania:
y=a*x+b


I to by było na tyle...
Aha, nie dam głowy że to dobrze działa ;-) ale powinno.


Podobne postybeta
A może by odkurzyć AI? ;-)
Bookmarklet do robienia CSV z obligacjami i ich oprocentowaniem ;-)
Logistic Regression wykrywa clickbaity lepiej od Bayesa ;-)
EEEBateria ;-)
Algorytmy Genetyczne szukają Symbolu Newtona ;-)

Brak komentarzy:

Prześlij komentarz