summaryrefslogtreecommitdiff
path: root/kalman.awk
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--kalman.awk30
1 files changed, 16 insertions, 14 deletions
diff --git a/kalman.awk b/kalman.awk
index f68cf81..7b6cb82 100644
--- a/kalman.awk
+++ b/kalman.awk
@@ -1,7 +1,7 @@
#!/usr/bin/awk -f
### kalman.awk
-# simple linear regression between columns
+
BEGIN {
sign = "[+-]?"
@@ -11,6 +11,8 @@ BEGIN {
number = "^" sign "(" decimal "|" fraction ")" exponent "$"
}
+
+# column headers
NR == 1 {
header_nf = NF
for (n=1; n<=NF; n++) {
@@ -18,31 +20,30 @@ NR == 1 {
}
}
-NF != 0 {
- #printf("\n%s: %s", NR, $0)
- if (NF > max_nf)
- max_nf = NF
- ### iterate over columns
- for (y=1; y<=max_nf; y++) {
+NF > 0 {
+ (NF > nf_max) ? nf_max = NF : nf_max = nf_max
+
+ # columns
+ for (y=1; y<=nf_max; y++) {
if ($y ~ number) {
- ### mean
+ # mean
count[y] += 1
sum[y] += $y
sum2[y] += $y*$y
mean[y] = sum[y]/count[y]
- ### difference from the mean
+ # difference from the mean
delta[y] = $y - mean[y]
sum_delta[y] += delta[y]
sum_delta2[y] += delta[y]*delta[y]
- ### sample variance
+ # sample variance
(count[y] - 1) ? var[y] = sum_delta2[y]/(count[y] - 1) : var[y] = 0
# x = row, y = col
- for (x=1; x<=max_nf; x++) {
+ for (x=1; x<=nf_max; x++) {
count[x,y] += 1
sum_xy[x,y] += $x*$y
sum_delta_xy[x,y] += delta[x]*delta[y]
@@ -72,7 +73,7 @@ NF != 0 {
b[x,y] = 1
}
- ### error estimate
+ # error estimate
err_den[x,y] = count[x,y]*(count[x,y] - 2)
if (count[x,y] > 2) {
err[x,y] = $y - (a[x,y] + b[x,y]*$x)
@@ -93,9 +94,10 @@ NF != 0 {
}
}
+
END {
- for (y=1; y<=max_nf; y++) {
- for (x=1; x<=max_nf; x++) {
+ for (y=1; y<=nf_max; y++) {
+ for (x=1; x<=nf_max; x++) {
if (x != y && r[x,y]) {
printf(OFMT OFS OFMT OFS "(%s)" OFS " = (" OFMT " +/- " OFMT ")(%s)" OFS " + (" OFMT " +/- " OFMT ")"ORS,
meas_cov[x,y], est_err_cov[x,y], header[y], b[x,y], b_err[x,y], header[x],