#!/usr/local/bin/perl use warnings; open IN, "<".$ARGV[0] or die "Cannot open $ARGV[0]: $!"; while (){ next if /^#/; chomp; s/ //; $count++; $y[$count]=$_; # print "$y[$count]\n"; $sumxy+=$count*$y[$count]; $sumx+= $count; $sumy+= $y[$count]; $sumx2 += $count**2; } close IN; $beta=($count*$sumxy-$sumx*$sumy)/($count*$sumx2-$sumx**2); $alfa=$sumy/$count-$beta*$sumx/$count; # ask: # print "Seasionality: "; # chomp ($sea = ); # if ($sea<=0 || $sea+0 ne $sea || $sea>$count/2) { # goto ask; # } $MIN=9e99; for $sea (1..int($count/2)){ @season=(); @c=(); $s=0; for $i (1 .. $count){ $s++; if ($s>$sea) { $s = 1; } $c[$s]++; $season[$s] += $y[$i]/($alfa+$beta*$i); } for $s (1 .. $sea){ $season[$s] /= $c[$s]; } $se=0; for $i (1..$count){ $s++; if ($s>$sea) { $s=1; } $f = ($alfa+$beta*$i) * $season[$s]; $se += ($f-$y[$i])**2; } $mse = $se/$count; if ($mse < $MIN){ $MIN = $mse; $seas=$sea; } } $sea=$seas; @season=(); @c=(); $s=0; for $i (1 .. $count){ $s++; if ($s>$sea) { $s = 1; } $c[$s]++; $season[$s] += $y[$i]/($alfa+$beta*$i); } for $s (1 .. $sea){ $season[$s] /= $c[$s]; } print "-" x 70,"\n"; print "y = $alfa + $beta x\n"; print "Seasonality = $sea\n"; print "-" x 70,"\n"; print "\tD\tF\tAD\tSE\n"; $s=0; for $i (1 .. $count){ $s++; if ($s>$sea) { $s=1; } $f = ($alfa+$beta*$i) * $season[$s]; $dd=$y[$i]; $ad=abs($dd-$f); $se=($dd-$f)**2; printf "%i)\t%.02f\t%.2f\t%.2f\t%.2f\n",$i,$dd,$f,$ad,$se; $mad+=$ad; $mse+=$se; } $mad /= $count; $mse /= $count; print "\t\tMAD=$mad\tMSE=$mse\n"; for $i ($count+1..$count+10){ $s++; if ($s>$sea) { $s=1; } print "$i)\t\t", ($alfa+$beta*$i)*$season[$s] , "\n"; } __END__