r - 多个训练,测试集平均分组
问题描述
我有一个包含三年数据的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 模型。
解决方案
这是拆分和应用问题的一个很好的例子。我将使用该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)
})
请注意,由于样本数据集很小,因此训练子集很多不包含变量的所有可能组合,并且可能会出错。
推荐阅读
- sql - 如何选择不与其他属性值共享的唯一域值?
- docker - 为什么从 Travis CI 推送后 Docker 映像没有出现在 Docker Hub 上
- sql - 如何将值从一个数据帧传递到另一个数据帧?
- python - 在同一绘图上绘制匀称的线串和匀称的地理点坐标
- glsl - GLSL 精明着色器
- android - 如何解决:错误:处理清单失败
- python - QProcess PyQt5 TypeError
- wordpress - 如何使用语法高亮编辑 wordpress 页面的 html
- office-js - Office 2019 中是否支持可固定任务窗格/SupportsPinning 元素(一次性购买,非 Office 365 版本)
- spring - 注释 @Size(min = 2, max = 30, message = "msg") 不适用于 onAuthenticationFailure() 方法