首页 > 解决方案 > 多个训练,测试集平均分组

问题描述

我有一个包含三年数据的df。

df <- data.table( YEAR = c("1999", "1999", "2000", "1999","2000", 
                           "2000","1999", "2000", "2001", "2001", "2001", "2001"),
                  Sex=c("M", "F","F", "M","M", "F","F", "F", "M", "F","F", "M"),
                  V3 = c(1,2,3,4,5,6,7,8,9,10,11,12),
                  V4 = rnorm(12, mean = 0, sd = 1))

每年的行数相同。我想创建 3 个线性回归模型,每年一个。每年的火车组规模在不同年份之间应该是相同的。例如,每年 3 个训练实例和 1 个测试实例。我知道一年做这件事有很多可能性,比如:

df_1999 <- df1 %>% 
filter (YEAR == 1999)  

samp <- sample(nrow(df_1999), 0.75 * nrow(df_1999)) 
train <- df[samp, ]
test <- df[-samp, ]

model_1999 <- lm(V4 ~ V3+ factor(Sex), data = df_1999)

但我不知道如何立即获得它以适合每个 lm 模型。

标签: rapply

解决方案


这是拆分和应用问题的一个很好的例子。我将使用该split()函数按年份拆分原始数据帧,然后我们 lapply 对数据的每个子集执行线性回归。

df <- data.frame( YEAR = c("1999", "1999", "2000", "1999","2000", 
                           "2000","1999", "2000", "2001", "2001", "2001", "2001"),
                  Sex=c("M", "F","F", "M","M", "F","F", "F", "M", "F","F", "M"),
                  V3 = c(1,2,3,4,5,6,7,8,9,10,11,12),
                  V4 = rnorm(12, mean = 0, sd = 1))

dfs<-split(df, df$YEAR)
set.seed(1)
lapply(dfs, function(df){
  samp <- sample(nrow(df), 0.75 * nrow(df)) 
  train <- df[samp, ]
  test <- df[-samp, ]
  model <- lm(V4 ~ V3+ factor(Sex), data = train)
})

请注意,由于样本数据集很小,因此训练子集很多不包含变量的所有可能组合,并且可能会出错。


推荐阅读