Расчет наклона и связанной статистики по строкам с использованием нескольких категорий в кадре данных, который имеет NA
Я посмотрел на связанные вопросы, размещенные в разделе: " Как я могу более эффективно рассчитать наклон нескольких подмножеств фрейма данных?", И мой статус новичка не позволяет мне напрямую комментировать этот поток (не уверен, как это сделать) поэтому я спрашиваю здесь:
Как избежать использования NA в наборе данных для обработки вычисления уклонов по нескольким категориям в кадре данных с использованием пакетных решений dplyr&broom? Вот образец сценария и результаты?
ПРИМЕР ДАННЫХ:
DOY<-c(102,102,102,102,102,102,102,102,102,102,212,212,212,212,212,212, 212,212,212,212)
LOCATION <- c(1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,3,3,3,3,3)
response <-c(NA,NA,NA,NA,NA,7,10,15,20,30,2,4,6,NA,8,10,15,20,30,NA)
ts <- c(0,10,20,30, 40,0,10,20,30,40,0,10,20,30,40,0,10,20,30,40)
test.data <- data.frame(cbind(DOY, LOCATION, response, ts))
library(dplyr)
library(broom)
test.data2 <- test.data %>% group_by(DOY) %>% do(tidy(lm(response ~ ts, data = .)))
test.data2 %>% filter(term == "ts")
РЕЗУЛЬТАТ РАБОТЫ В ОДНОМ СОСТОЯНИИ (так как на строку достаточно данных без NA):
# A tibble: 2 x 6
# Groups: DOY [2]
# DOY term estimate std.error statistic p.value
# <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 102. ts 0.560 0.0721 7.77 0.00444
# 2 212. ts 0.278 0.247 1.13 0.303
НО ЕСЛИ НЕСКОЛЬКО КАТЕГОРИЙ ИСПОЛЬЗУЮТСЯ ДЛЯ ГРУППЫ, ТОГДА НЕ
test.dataX <- test.data %>% group_by(LOCATION, DOY) %>% do(tidy(lm(response ~ ts, data = .)))
РЕЗУЛЬТАТЫ в ошибках:
# Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
# 0 (non-NA) cases
test.dataX %>% filter(term == "ts")
# Error in eval(lhs, parent, parent) : object 'test.dataX' not found
Попытка 2: я попытался na.omit в lm(), но это также не сработало:
test.dataX <- test.data %>% group_by(LOCATION, DOY) %>% do(tidy(lm(response ~ ts, data = ., na.action=na.omit)))
# Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
# 0 (non-NA) cases
Идеально я хотел бы иметь что-то подобное (вместе с R2, если это возможно - как мне добавить это к выводу выше)?
# DOY LOCATION slope R2
# 102 1 NA NA
# 102 2 0.560 0.953
# 212 1 0.149 0.966
# 212 3 0.650 0.966
########################ПОЖАЛУЙСТА, ПОРЕКОМЕНДУЙТЕ. БЛАГОДАРЮ ВАС!
1 ответ
Если мы хотим вернуть NA, используйте possibly
library(tidyverse)
library(broom)
pos1 <- possibly(lm, otherwise = NULL)
prsq <- possibly(pull, otherwise = NA)
test.data %>%
group_by(DOY, LOCATION) %>%
nest %>%
mutate(model = map(data, ~ pos1(response~ ts, data = .x)),
slope = map_dbl(model, ~
.x %>%
tidy %>%
filter(term == 'ts') %>%
prsq(estimate)),
R2 = map_dbl(model, ~
.x %>%
glance %>%
prsq(r.squared))) %>%
select(-data, -model)
# A tibble: 4 x 4
# DOY LOCATION slope R2
# <dbl> <dbl> <dbl> <dbl>
#1 102 1 NA NA
#2 102 2 0.56 0.953
#3 212 1 0.149 0.966
#4 212 3 0.650 0.966