I have an imbalanced time series dataset in which older cohorts have more observations than newer cohorts. I'm trying to use strata
and sampsize
in R's randomForest
function to downsample the older cohorts in order to build a regression model. However, my attempt is resulting in the error "sampsize should be of length one". Aside from the error, I'm wondering if this approach is appropriate or necessary for random forest regression. I know it's a common way to deal with imbalanced data in random forest classification.
Below is my R
code. Most of it is just to construct a hypothetical data frame with imbalanced cohort data. I then try to build random forest models, one that doesn't try to stratify sampling (that works) and one that does try to stratify sampling (results in error)
#Create data frame in which older cohorts have more observations
date <- c(seq.Date(as.Date('2016-01-01'), as.Date('2016-10-01'), "month"),
seq.Date(as.Date('2016-02-01'), as.Date('2016-10-01'), "month"),
seq.Date(as.Date('2016-03-01'), as.Date('2016-10-01'), "month"),
seq.Date(as.Date('2016-04-01'), as.Date('2016-10-01'), "month"),
seq.Date(as.Date('2016-05-01'), as.Date('2016-10-01'), "month"),
seq.Date(as.Date('2016-06-01'), as.Date('2016-10-01'), "month"))
cohort <- factor(c(rep(1,10),rep(2,9),rep(3,8),rep(4,7),rep(5,6),rep(6,5)))
set.seed(10)
x1 <- 1:10 + rnorm(10)
x2 <- sin(10) + rnorm(10)
y <- x1 + x2 + rnorm(10)
set.seed(1)
x1noise2 <- rnorm(9, 0, .1)
x1noise3 <- rnorm(8, 0, .1)
x1noise4 <- rnorm(7, 0, .1)
x1noise5 <- rnorm(6, 0, .1)
x1noise6 <- rnorm(5, 0, .1)
x1 <- c(x1, x1[2:10]+x1noise2, x1[3:10]+x1noise3, x1[4:10]+x1noise4, x1[5:10]+x1noise5, x1[6:10]+x1noise6)
set.seed(2)
x2noise2 <- rnorm(9, 0, .1)
x2noise3 <- rnorm(8, 0, .1)
x2noise4 <- rnorm(7, 0, .1)
x2noise5 <- rnorm(6, 0, .1)
x2noise6 <- rnorm(5, 0, .1)
x2 <- c(x2, x2[2:10]+x2noise2, x2[3:10]+x2noise3, x2[4:10]+x2noise4, x2[5:10]+x2noise5, x2[6:10]+x2noise6)
set.seed(3)
ynoise2 <- rnorm(9, 0, .1)
ynoise3 <- rnorm(8, 0, .1)
ynoise4 <- rnorm(7, 0, .1)
ynoise5 <- rnorm(6, 0, .1)
ynoise6 <- rnorm(5, 0, .1)
y <- c(y, y[2:10]+ynoise2, y[3:10]+ynoise3, y[4:10]+ynoise4, y[5:10]+ynoise5, y[6:10]+ynoise6)
df <- data.frame(date, cohort, x1, x2, y)
#Plot of data shown below
plot(df$date, df$y, col=df$cohort)
#Build random forest models
library(randomForest)
set.seed(4)
rf1 <- randomForest(y~x1+x1, data=df) #This works
set.seed(4)
rf2 <- randomForest(y~x1+x1, data=df, strata=df$cohort, sampsize=rep(4,6)) #This results in error saying 'sampsize should be of length one'