dvmlls
dvmlls

Reputation: 2246

R: running corr across two matrices by column

I'm tracking how much my cats are pooping, and trying to figure out if that's correlated with how much they're eating.

So if I have the following data:

food <- cbind(fluffy=c(0.9,1.1,1.3,0.7),misterCuddles=c(0.5,1.2,1.4,0.5))
poop <- cbind(fluffy=c(0.9,1.1,1.3,0.7),misterCuddles=c(-0.5,-1.2,-1.4,-0.5))
dates <- c("2013-01-01", "2013-01-02", "2013-01-03","2013-01-04")
rownames(food) <- dates
rownames(poop) <- dates
cube <- abind(food, poop, along=3)

Notes for the curious:

This gives me the following:

> cube

, , food

           fluffy misterCuddles
2013-01-01    0.9           0.5
2013-01-02    1.1           1.2
2013-01-03    1.3           1.4
2013-01-04    0.7           0.5

, , poop

           fluffy misterCuddles
2013-01-01    0.9          -0.5
2013-01-02    1.1          -1.2
2013-01-03    1.3          -1.4
2013-01-04    0.7          -0.5

Now if I want to find the correlation for mister cuddles to demonstrate his magic:

> corr(cube[,"misterCuddles",])

[1] -1

What I'd like is a named vector with the correlation number for each cat:

> c(fluffy=1.0,misterCuddles=-1.0)

       fluffy misterCuddles 
            1            -1 

Is there a way I can do this in one shot, ideally in parallel? In reality, I have buttloads of cats.

Thanks!

EDIT

Can it be as simple as...

> result <- simplify2array(mclapply(colnames(food), function(x) corr(cube[,x,])))
> names(result) <- colnames(food)
> result
       fluffy misterCuddles 
            1            -1 

Upvotes: 1

Views: 78

Answers (1)

Sven Hohenstein
Sven Hohenstein

Reputation: 81693

library(boot) # for corr
sapply(dimnames(cube)[[2]], function(x) corr(cube[ , x, ]))

#    fluffy misterCuddles 
#         1            -1

Upvotes: 2

Related Questions