Выполнение нескольких двух выборочных t-тестов для двух списков фреймов данных, содержащих много столбцов

У меня есть два списка по четыре фрейма данных в каждом. Фреймы данных в обоих списках (loc_list_future и loc_list_2019) содержат 33 столбца: Год, а затем средние значения осадков для 32 различных моделей климата.

Фреймы данных в loc_list_future выглядят следующим образом, но всего с 32 столбцами модели, а данные относятся к 2059 году:

Year     Model 1    Model 2      Model 3   ...Model 32
2020    714.1101    686.5888    1048.4274       
2021   1018.0095    766.9161     514.2700      
2022    756.7066    902.2542     906.2877       
2023    906.9675    919.5234     647.6630       
2024    767.4008    861.1275     700.2612     
2025    876.1538    738.8370     664.3342       
2026    781.5092    801.2387     743.8965     
2027    876.3522    819.4323     675.3022       
2028    626.9468    927.0774     696.1884       
2029    752.4084    824.7682     835.1566  
...
2059   

Фреймы данных в loc_list_2019 имеют годы в диапазоне от 2006-2019, но в остальном выглядят одинаково.

Каждый фрейм данных представляет географическое местоположение, и два списка имеют одинаковые четыре местоположения, но один список предназначен для значений 2006–2019 годов, а другой - для будущих значений.

Я хотел бы провести t-тесты с двумя выборками, которые сравнивают значения 2006-19 годов с будущими значениями для каждой модели в каждом месте.

У меня есть другой список (loc_list_OBS), в котором есть фреймы данных только с двумя столбцами Year и Mean_Precip (это наблюдаемые данные, не основанные на моделях, поэтому есть только один столбец для среднего количества осадков). У меня есть код (см. Ниже), который будет запускать t-тесты с двумя выборками для наблюдаемых данных (loc_list_OBS) против будущих данных (loc_list_future), но я не уверен, как я могу изменить этот код для запуска t-тестов для двух списков в каждой по 32 модели.

myfun <- function(x,y)
{
  OBS_Data <- x$Mean_Precip
  #Empty list
  List <- list()
  #Now loop
  for(i in 2:dim(y)[2])
  {
    #Label
    val <- names(y[,i,drop=F])
    Future_Data <- y[,i]
    #Test
    test <- t.test(OBS_Data, Future_Data, alternative = "two.sided") 
    #Save
    List[[i-1]] <- test
    names(List)[i-1] <- val
  }
  return(List)
}

t.stat <- mapply(FUN = myfun,x=loc_list_OBS,y=loc_list_future, SIMPLIFY = FALSE) 

person Garner Kohrell    schedule 10.09.2020    source источник


Ответы (1)


Я бы предложил следующий подход. Я создал фиктивные данные, похожие на те, что есть у вас. Вот код:

#Data before
dfb <- structure(list(Year = 2010:2019, Model.1 = c(614.1101, 918.0095, 
656.7066, 806.9675, 667.4008, 776.1538, 681.5092, 776.3522, 526.9468, 
652.4084), Model.2 = c(586.5888, 666.9161, 802.2542, 819.5234, 
761.1275, 638.837, 701.2387, 719.4323, 827.0774, 724.7682), Model.3 = c(948.4274, 
414.27, 806.2877, 547.663, 600.2612, 564.3342, 643.8965, 575.3022, 
596.1884, 735.1566)), class = "data.frame", row.names = c(NA, 
-10L))
#Data after
dfa <- structure(list(Year = 2020:2029, Model.1 = c(714.1101, 1018.0095, 
756.7066, 906.9675, 767.4008, 876.1538, 781.5092, 876.3522, 626.9468, 
752.4084), Model.2 = c(686.5888, 766.9161, 902.2542, 919.5234, 
861.1275, 738.837, 801.2387, 819.4323, 927.0774, 824.7682), Model.3 = c(1048.4274, 
514.27, 906.2877, 647.663, 700.2612, 664.3342, 743.8965, 675.3022, 
696.1884, 835.1566)), class = "data.frame", row.names = c(NA, 
-10L))

Теперь код:

#Data for lists
L.before <- list(df1=dfb,df2=dfb,df3=dfb,df4=dfb)
L.after <- list(df1=dfa,df2=dfa,df3=dfa,df4=dfa)

Функция:

#Function
myfun <- function(x,y)
{
  #Create empty list
  List <- list()
  #Loop
  for(i in 2:dim(x)[2])
  {
    name <- names(x[,i,drop=F])
    before <- x[,i]
    after <- y[,i]
    #Test
    test <- t.test(before, after, alternative = "two.sided") 
    #Save
    List[[i-1]] <- test
    names(List)[i-1] <- name
  }
  return(List)
}

Приложение:

#Apply
t.stat <- mapply(FUN = myfun,x=L.before,y=L.after, SIMPLIFY = FALSE)

Некоторые выходы:

t.stat[[1]]

$Model.1

    Welch Two Sample t-test

data:  before and after
t = -1.9966, df = 18, p-value = 0.06122
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -205.224021    5.224021
sample estimates:
mean of x mean of y 
 707.6565  807.6565 


$Model.2

    Welch Two Sample t-test

data:  before and after
t = -2.8054, df = 18, p-value = 0.0117
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -174.88934  -25.11066
sample estimates:
mean of x mean of y 
 724.7764  824.7764 


$Model.3

    Welch Two Sample t-test

data:  before and after
t = -1.4829, df = 18, p-value = 0.1554
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -241.67613   41.67613
sample estimates:
mean of x mean of y 
 643.1787  743.1787 

Дайте мне знать, если это сработает для вас!

person Duck    schedule 10.09.2020
comment
Да, это сработало очень хорошо! Еще раз спасибо Дак! Я действительно ценю твою помощь. - person Garner Kohrell; 10.09.2020