Как создать фрейм данных, используя результаты (выходные данные) функции sens.slope? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть данные Excel с несколькими листами. Я импортировал их в R и применил тест тренда Манна-Кендалла с функцией sens.slope () . Результаты этой функции относятся к классу htest , но я хочу поместить их в таблицу.

Я установил необходимые пакеты и импортировал каждый лист набора данных.

require(readxl)
require(trend)
tmin1 <- read_excel("C:/TEZ/ANALİZ/future_projection/2051-2100/model 3-3/average_tmin_3_3_end.xlsx", sheet = "acipayam")
tmin2 <- read_excel("C:/TEZ/ANALİZ/future_projection/2051-2100/model 3-3/average_tmin_3_3_end.xlsx", sheet = "adana")
...
tmin57 <- read_excel("C:/TEZ/ANALİZ/future_projection/2051-2100/model 3-3/average_tmin_3_3_end.xlsx", sheet = "yumurtalik")

Затем указали столбцы для тестирования тренда.

x1<-tmin1$`13`
x2<-tmin1$`14`
x3<-tmin1$`15`
x4<-tmin1$`16`
x5<-tmin1$`17`
...
x281<-tmin57$`13`
x282<-tmin57$`14`
x283<-tmin57$`15`
x284<-tmin57$`16`
x285<-tmin57$`17`

И применили функцию.

sens.slope(x1)
sens.slope(x2)
sens.slope(x3)
....
sens.slope(x285)

Результат выглядит следующим образом.

> sens.slope(x1)

    Sen's slope

data:  x1
z = 4.6116, n = 49, p-value = 3.996e-06
alternative hypothesis: true z is not equal to 0
95 percent confidence interval:
 0.03241168 0.08101651
sample estimates:
Sen's slope 
 0.05689083 

> sens.slope(x2)

    Sen's slope

data:  x2
z = 6.8011, n = 49, p-value = 1.039e-11
alternative hypothesis: true z is not equal to 0
95 percent confidence interval:
 0.05632911 0.08373755
sample estimates:
Sen's slope 
 0.07032428 
...

Как я могу поместить эти значения в одну таблицу и записать их в файл Excel? (имена необходимых значений: statisti c и оценки в функции.)

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Существует пакет broom именно для этого:

library(tidyverse)
library(trend)

sens.slope(runif(1000)) %>%
  broom::tidy()

# A tibble: 1 x 7
  statistic p.value parameter   conf.low conf.high method      alternative
      <dbl>   <dbl>     <int>      <dbl>     <dbl> <chr>       <chr>      
1     0.548   0.584      1000 -0.0000442 0.0000801 Sen's slope two.sided  

А если у вас много фреймов данных, свяжите их все в один список и l oop это закончено с map_df:

A = tibble(Value = runif(1000))
B = tibble(Value = runif(1000))
C = tibble(Value = runif(1000))
D = tibble(Value = runif(1000))

list(A,B,C,D) %>%
  map_df(~.x %>% 
           pull(1) %>%
           sens.slope() %>%
           broom::tidy())
# A tibble: 4 x 7
  statistic p.value parameter   conf.low  conf.high method      alternative
      <dbl>   <dbl>     <int>      <dbl>      <dbl> <chr>       <chr>      
1    -0.376  0.707       1000 -0.0000732  0.0000502 Sen's slope two.sided  
2    -2.30   0.0215      1000 -0.000138  -0.0000110 Sen's slope two.sided  
3    -1.30   0.194       1000 -0.000104   0.0000209 Sen's slope two.sided  
4     0.674  0.500       1000 -0.0000410  0.0000848 Sen's slope two.sided

Редактировать: Только что понял, что broom::tidy в этом случае не дает оценку (еще не сталкивался с этим), вот решение без использования broom:

A = tibble(Value = runif(1000))
B = tibble(Value = runif(1000))
C = tibble(Value = runif(1000))
D = tibble(Value = runif(1000))

list(A,B,C,D) %>%
  purrr::map_df(.,~{
    Test = sens.slope(.x %>% pull(1))
    Test = tibble(Estimate = Test["estimates"] %>% unlist,
           Statistic = Test["statistic"] %>% unlist)
  }
 )
# A tibble: 4 x 2
     Estimate Statistic
        <dbl>     <dbl>
1 -0.0000495     -1.55 
2 -0.00000491    -0.155
3  0.0000242      0.755
4 -0.0000301     -0.921
0 голосов
/ 03 мая 2020

Попробуйте использовать списки вместо большого количества объектов в глобальной среде.

Теперь, когда они у вас уже есть, вы можете объединить их в список, применить sens.slope к каждому, извлечь statistic и estimates из них получить датафрейм.

library(trend)

output <- data.frame(t(sapply(mget(paste0('x', 1:285)), function(y) 
                     {temp <- sens.slope(y);c(temp$statistic, temp$estimates)})))

Теперь вы можете записать этот фрейм данных как csv, используя write.csv.

write.csv(output, 'output.csv', row.names = FALSE)
...