R - цикл по списку метрик в пользовательской модели - PullRequest
0 голосов
/ 26 апреля 2018

В настоящее время у меня есть модель различий, и я хотел бы эффективно измерить различные показатели для одной и той же модели.

Например, у меня есть фрейм данных со столбцами для количества пройденных миль, отработанных часов, состояния, группы, времени.

В настоящее время есть код, куда я копирую и вставляю модель для каждой метрики:

# Create DID models
model_miles <- lm(df$miles_driven ~ df$Group 
                    + df$Time 
                    + df$Group * df$Time, data = df)
model_hours <- lm(df$hours_worked ~ df$Group 
       + df$Time 
       + df$Group * df$Time, data = df)

# Select results using clustered standard errors. The purpose of this is to 
# avoid making distributional assumptions about the errors in the models. 
results_miles <- clubSandwich::coef_test(model_miles, 
                                        vcov = "CR2", 
                                        cluster = df$state, 
                                        test = "Satterthwaite")
results_hours <- clubSandwich::coef_test(model_hours, 
                           vcov = "CR2", 
                           cluster = df$state, 
                           test = "Satterthwaite")

 results <- data.table::rbindlist(list(results_miles, results_hours))
View(results)

Я хотел бы каким-то образом создать список имен моих метрик и выполнить цикл по этому списку, используя пользовательскую функцию, чтобы сделать этот процесс более быстрым и более автоматизированным, но я не смог заставить его работать правильно:

#list of metrics
metrics <- c("miles_driven", "hours_worked")

udf <- function(metric, dataframe){
 # Create DID model
 model <- lm(dataframe$metric ~ df$Group 
            + dataframe$Time 
            + dataframe$Group * df$Time, data = dataframe)

 # Select results using clustered standard errors. The purpose of this 
 is to 
 # avoid making distributional assumptions about the errors in the 
 models. 
 results_miles <- clubSandwich::coef_test(model_miles, 
                                   vcov = "CR2", 
                                   cluster = dataframe$state, 
                                   test = "Satterthwaite")[4,]
 View(results)
}

lapply(metrics, udf)

Любое понимание будет оценено. Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

В этих ситуациях я всегда glue формула вместе в lm. Пример ниже. Вы можете просто дать имена переменных, если вы указали lm с аргументом data, вместо того, чтобы явно передавать dataframe$varname.

library(glue)
dostuff <- function(metric, dataframe){
  model.form <- '{metric} ~ b + c + c*d'
  lm(as.formula(glue(model.form)), data = dataframe)
}

df <- data.frame(a = runif(10), b = runif(10), c = runif(10), d = runif(10))

dostuff('a', df)

Если вы хотите придерживаться базы R, два объекта ниже равны

glue('{metric} ~ b + c + c*d')
paste(metric, '~ b + c + c*d')
0 голосов
/ 26 апреля 2018

Это будет работать, если вы используете [[ вместо $.

Например:

dat <- data.frame(A=1:1, B=1:2)
x <- "A"
lm(dat[[x]] ~ dat$B)

Вы можете делать более сложные вещи такого рода в циклах, используя get и assign.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...