Расчет наклона и связанной статистики по строкам с использованием нескольких категорий в кадре данных, который имеет NA - PullRequest
0 голосов
/ 09 июня 2018

Я посмотрел на соответствующие вопросы, размещенные в разделе: " Как я могу более эффективно рассчитать наклон нескольких подмножеств фрейма данных? ", и мой статус новичка не позволяет мне комментировать эту темунапрямую (не знаю, как это сделать), поэтому я спрашиваю здесь:

Как избежать использования 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 Ответ

0 голосов
/ 09 июня 2018

Если мы хотим вернуть 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
...