## Labels

R (15) Admin (12) programming (11) Rant (6) personal (6) parallelism (4) HPC (3) git (3) linux (3) rstudio (3) spectrum (3) C++ (2) Modeling (2) Rcpp (2) SQL (2) amazon (2) cloud (2) frequency (2) math (2) performance (2) plotting (2) postgresql (2) DNS (1) Egypt (1) Future (1) Knoxville (1) LVM (1) Music (1) Politics (1) Python (1) RAID (1) animation (1) audio (1) aws (1) data (1) economics (1) graphing (1) hardware (1)

## 25 November 2012

### Successive Differences of a Randomly-Generated Timeseries

I was wondering about the null distribution of successive differences of random sequences, and decided to do some numerical experiments. I quickly realized that successive differences equates to taking successively higher-order numerical derivatives, which functions as a high-pass filter. So, the null distribution really depends on the spectrum of the original timeseries.

Here, I've only played with random sequences, which are equivalent to white noise. Using the wonderful animation package, I created a movie that shows the timeseries resulting from differencing, along with their associated power spectra. You can see that, by the end, almost all of the power is concentrated in the highest frequencies. The code required to reproduce this video is shown below.

Note -- For optimum viewing, switch the player quality to high.
```require(animation)
## large canvas, write output to this directory, 1 second per frame
ani.options(ani.width=1280, ani.height=720, loop=F, title='Successive differences of white noise', outdir='.', interval=1)
require(plyr)
require(xts)
## How many realizations to plot?
N=5
## random numbers
aa = sapply(1:26, function(x) rnorm(1e2));
colnames(aa) = LETTERS;

saveVideo( {
## for successive differences, do...
for (ii in 1:50) {
## first make the differences and normalize
aa1 = apply(aa, 2, function(x) {
ret=diff(x, differences=ii);ret=ret/max(ret)
});
## Turn into timeseries object for easy plotting
aa1 = xts(aa1, as.Date(1:nrow(aa1)));

## next, compute spectrum
aa2 = alply(aa1, 2, function(x) {
## of each column, don't modify original data
ret=spectrum(x, taper=0, fast=F, detrend=F, plot=F);
## turn into timeseries object
ret= zoo(ret\$spec, ret\$freq)});
## combine into timeseries matrix
aa2 = do.call(cbind, aa2 );
colnames(aa2) = LETTERS;

## plot of timeseries differences
## manually set limits so plot area is exactly the same between successive figures
myplot = xyplot(aa1[,1:N], layout=c(N,1),
xlab=sprintf('Difference order = %d', ii),
ylab='Normalized Difference',
ylim=c(-1.5, 1.5),
scales=list(alternating=F, x=list(rot=90), y=list(relation='same')));

## plot of spectrum
myplot1 = xyplot(aa2[,1:N], layout=c(N,1),
ylim=c(-0.01, 5), xlim=c(0.1, 0.51),
xlab='Frequency', ylab='Spectral Density',
type=c('h','l'),
scales=list(y=list(relation='same'), alternating=F));
## write them to canvas
plot(myplot, split=c(1,1,1,2), more=T);
plot(myplot1, split=c(1,2,1,2), more=F);
## provide feedback of process
print(ii)}

## controls for ffmpeg
}, other.opts = "-b 5000k -bt 5000k")
```

## 08 November 2012

### Consumerist Dilemas

Consumer society gives us lots of choices, but sometimes provides little opportunity for post-choice customization. We buy something, and we can either return it or keep it, but it is what it is. Want something a little shorter, a little tighter, or a little less stiff? Too bad. Unless you're loaded, and then you can hire someone to do a custom job. But, to my knowledge, even the super-rich no longer order custom automobiles.

For a small subset of expensive, long-lived personal items like cars and mattresses, this can make new purchases particularly stressful. This is one plausible explanation for the copious consumer-choice media devoted to, for example, cars, as well as the effort companies put into brand identity. If they sell you something that you like, then there's a reasonable chance you'll get another one, the "safe choice", when the old one breaks.

I've faced this dilemma recently with shoes and glasses. I typically have one or two pairs of each that I use primarily, daily, typically for at least 2 years. I'm very near-sighted, so I have to get the expensive high-index lenses. My big toes spread out, I assume from years of wearing flip-flops and Chacos, so most every shoe feels narrow and pointy. The decision to get a new pair of glasses or shoes fills me with an existential dread -- what if I'm stuck with costly discomfort for the next year or more?

This month I discovered that keyboards engender a similar dread. I'm at a keyboard for at least 20 hours on an average week, and I imagine it gets up to 60 hours on a long week. Not all of that is typing, but I've had a slowly building case of carpal tunnel / repetitive stress injury, particularly in my right hand, from long coding sessions that involve heavy use of shift, up-arrow, and enter keys. After a month of poking around the internet, checking reviews on Amazon and looking at eBay for used items, I felt totally conflicted. I just wanted to "try something on" before I shelled out cash to saddle myself with something that I ended up hating.

But anything would be better than my stock Dell monstrosity. In this spirit, I dropped by the chaotic indie computer parts/repair store across the street from campus, and found two ergonomic keyboards used and on the cheap:

#1 Microsoft Comfort Curve 2000 v1