несколько поездов, тестовые наборы одинаково сгруппированы - PullRequest
1 голос
/ 31 марта 2020

У меня есть файл с данными за три года.

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.

1 Ответ

1 голос
/ 31 марта 2020

Это хороший пример проблемы разделения и применения. Я бы использовал функцию split(), чтобы разделить исходный фрейм данных по годам, а затем использовать их для выполнения линейной регрессии для каждого подмножества данных.

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)
})

Обратите внимание, поскольку этот выборочный набор данных мал, Если подмножество поездов не содержит всех возможных комбинаций переменных и может содержать ошибку.

...