Я пытался подогнать линейную модель к большому набору данных (~ 45 миллионов групп по 3 точки на группу). Из-за огромного размера моего набора данных обязательно будут случаи, когда соответствие модели будет отключено. Следовательно, я получаю сообщение об ошибке, связанной с NA в моей модели lm, например:
Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
0 (non-NA) cases
Проблема возникает, когда я пытаюсь обернуть lm вокруг TryCatch или Salely, чтобы поймать и обработать случайные ошибки в процессе подгонки.
Я пробовал пока несколько подходов. Здесь я даю вам фиктивный набор данных:
Чтобы обойти эту ошибку, я попробовал несколько методов. Вы можете возразить, что самый простой способ - сделать сгруппированный фильтр и исключить все наборы данных, полные НА (что я тоже пытался сделать, но, по-видимому, есть некоторые, у которых есть проблемы другого рода, из-за которых моя модель выдает ошибки).
Следовательно, поскольку я хочу иметь надежный поток, применимый к многим типам данных, я пытаюсь написать что-то довольно общее и отказоустойчивое.
Более того, я надеялся использовать multidplyr для распараллеливания, поэтому пошел по пути dplyr. Вот в чем проблема. Как только я оборачиваюсь вокруг либо tryCatch, либо safe, даже если я открою позже broom: tidy не сможет обработать результат. (что является большим обломом, так как это облегчает мою жизнь, поскольку мне не нужно все время кодировать по-лаппийски)
Случай 1: Простая пленка подходит стандартным образом плюс комбинируется с метлой. Все хорошо
library(tidyverse)
df.h= tibble(
hour = factor(c("1_1","1_1","1_1")),
price = c(3.235536,3.205588, 3.235930),
wind = c(-2.302585, 3.871201, 5.123964)
)
dfHour = df.h2 %>% group_by(hour) %>%
do(fitHour = lm(price ~ wind, data = .))
dfHourCoef = broom::tidy(dfHour, fitHour)
Введите набор данных с ошибками, чтобы вызвать ошибку в lm:
library(tidyverse)
df.h2= tibble(
hour = factor(c("1_1","1_1","1_1","1_2","1_2","1_2")),
price = c(3.235536,3.205588, 3.235930, 3.235536,3.205588, 3.235930),
wind = c(-2.302585, 3.871201, 5.123964, NA, NA, NA)
)
dfHour2 = df.h2 %>% group_by(hour) %>%
do(fitHour = tryCatch( lm(myy ~ myx, data = . ), error= function(e){return("FAILURE")} ) ) %>%
filter(!is.character(fitHour)) # Exploit the fact that all good outputs are
# a list while faulty output is a character
# to perform filtering
# get the coefficients by group in a tidy data_frame
dfHourCoef2 = broom::tidy(dfHour2, fitHour)
Это вызывает ошибку типа:
Error in .[[object]][[1]] : subscript out of bounds
Способ третий: безопасное завершение, чтобы улавливать сообщения об ошибках
library(tidyverse)
df.h2= tibble(
hour = factor(c("1_1","1_1","1_1","1_2","1_2","1_2")),
price = c(3.235536,3.205588, 3.235930, 3.235536,3.205588, 3.235930),
wind = c(-2.302585, 3.871201, 5.123964, NA, NA, NA)
)
test_dataset_lm <- df.h2 %>%
mutate_if(is.factor, droplevels) %>% # this is used to exclude leftover
# factor levels from previous
# processing in the flow
group_by( hour ) %>%
do(fitHour = safely(lm)(price ~ wind, data = .)) %>%
unnest() %>%
group_by(hour) %>%
mutate(id = str_c("fitHour_", row_number() ) ) %>% # Exploit that the
# $error list is always
# in the second position of every
# output / modelfit trial
spread(id, fitHour) %>%
filter( fitHour_2 == "NULL" ) %>%
rename(fitHour = fitHour_1) %>%
select(-fitHour_2) %>% ungroup() %>%
broom::tidy()
Последний подход является более дорогостоящим с точки зрения вычислений и, как ожидается, будет намного сложнее работать с очень большим набором данных.
Ошибка, которую дает этот подход в сочетании с tidy ():
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?
Я подозреваю, что все сообщения об ошибках являются результатом того, насколько аккуратно (и на первый взгляд) ожидает структура созданного вложенного списка, но я просто не могу понять, как правильно сделать его эквивалентным версиям без оболочки.
Не могли бы вы помочь мне понять источник моей проблемы?
Спасибо!
dfHourCoef = broom::tidy(dfHour, fitHour)>Error in broom::tidy(dfHour, fitHour) : object 'dfHour' not found
- person Grada Gukovic   schedule 05.08.2019df.h2
наdf.h
в исполнении lm!dfHour = df.h2 %>% group_by(hour) %>% do(fitHour = lm(price ~ wind, data = .))
- person Marios Barlas   schedule 05.08.2019