Перехват ошибок при построении моделей
Ожидаемая продолжительность жизни при рождении — один из ключевых показателей здоровья населения.
Вы работаете консультантом в области общественного здравоохранения. Ваш клиент хочет узнать, насколько увеличивается продолжительность жизни на каждый доллар, потраченный на здравоохранение. Вы собрали данные о продолжительности жизни (в годах) для всех стран и соответствующих расходах на здравоохранение на душу населения за период с 2001 по 2021 год. Статистик-консультант написал код для подгонки регрессионных моделей к данным по каждой стране. Однако в данных есть пропущенные значения, которые вызывают ошибки при построении моделей.
В вашем рабочем пространстве есть список датафреймов ls_df, где каждый элемент содержит данные по отдельной стране. Вы планируете распараллелить вычисления с помощью parLapply() и использовать tryCatch() для перехвата ошибок. Пакет parallel уже загружен.
Это упражнение является частью курса
Параллельное программирование на R
Инструкции к упражнению
- Передайте функцию в аргумент error. Эта функция должна принимать один аргумент
eи использоватьpaste(), чтобы добавить строку"Error!"передe. - Измените
fit_lm()так, чтобы она проверяла, является лиmodelсимвольной строкой с сообщением об ошибке. - Создайте кластер из шести ядер.
- Примените
fit_lm()к спискуls_dfв параллельном режиме с помощьюparLapply().
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
fit_lm <- function (df) {
model <- tryCatch(lm(life_expectancy ~ health_exp_per_capita, data = df),
# Supply a function that pastes "Error!" and one argument, e
error = ___)
# If model is character (error) return model else return model coefficient
if (___) return(model)
else return(coef(model)[2])
}
# Make a cluster of six cores
cluster <- ___(___)
# Apply fit_lm in parallel to ls_df using cluster
ls_mod <- parLapply(___, ___, ___)
stopCluster(cluster)
print(paste(sum(sapply(ls_mod, is.numeric)), "models fit and", sum(sapply(ls_mod, is.character)), "errors caught!"))