Ищете эффективный способ сравнения точек и областей в данных временных рядов с несколькими независимыми переменными - PullRequest
1 голос
/ 19 января 2020

Если вам известен пример набора данных, который будет полезен при ответе на этот вопрос, это приветствуется. Предположим, у меня есть фрейм данных, который имеет следующую структуру:

>data
  ID  Location Sex   Time Copper Iron  Carbon  Mg   Lead  CaCO3
   12     A     M     1    …      …     …     …     …     … 
   12     A     M     2    …      …     …     …     …     … 
   12     A     M     3    …      …     …     …     …     … 
   12     A     M     4    …      …     …     …     …     …
   12     A     M     5    …      …     …     …     …     … 
   12     A     M     6    …      …     …     …     …     … 
   234    A     M     1    …      …     …     …     …     … 
   234    A     M     2    …      …     …     …     …     … 
   234    A     M     3    …      …     …     …     …     … 
   234    A     M     4    …      …     …     …     …     … 
   234    A     M     5    …      …     …     …     …     …  

Есть несколько сотен человек, каждый из которых имеет уникальный идентификационный номер. Концентрация каждого элемента или вещества (медь, железо, углерод, Mg, свинец, CaCO3) измеряется каждую секунду в течение периода времени, уникального для каждого человека. Таким образом, в реальных данных есть несколько сотен измерений на человека. Например, в приведенном выше примере есть только 6 наблюдений для отдельного 12 и 5 наблюдений для отдельного 234. В действительности индивидуальный 12 может иметь 980 наблюдений, а индивидуальный 234 может иметь 1249 наблюдений.

Из-за характера этих В измерениях концентрация каждого вещества должна быть одинаковой (или очень похожей) в начале и в конце для каждого человека. Например, если индивидуум 12 имеет 980 наблюдений, концентрация Copper в первых нескольких наблюдениях (время 1: n) должна быть аналогична последним нескольким наблюдениям (n: 980), и это верно для всех веществ. Чтобы проверить эту гипотезу и получить представление о том, как долго (или сколько точек данных) вещества остаются одинаковыми в обоих концах ряда, я хочу провести парные t-тесты между первым наблюдением и средним значением первых 5 наблюдений. , первое наблюдение и последнее наблюдение, среднее из первых 5 наблюдений и среднее из последних 5 наблюдений, и то же самое для среднего из первых и последних 7 и 10 наблюдений, т. д ...

Каков наилучший способ решения этой проблемы? Вот как я начал go об этом:

Сначала сохраните значение для каждой точки интереса (первая точка, среднее значение первых 7 точек и т. Д.) В отдельных фреймах данных:

#examples shown for the first point, and the average of the first 7 points:
#get the first data point for each individual:
FirstPt<-
  data%>%
  group_by(ID)%>%
  slice(1)
FirstPt <-
  FirstPt%>%
  pivot_longer(Copper:CaCO3, names_to = "Variable")
FirstPt <- as.data.frame(FirstPt)
#repeat for the last data point replace slice(1) with slice(n())

#get the average of the first 7 data points for each individual:
First7avg<-
data%>%
  pivot_longer(Copper:CaCO3, names_to = "Variable")%>%
  group_by(ID,Location,Sex, Variable)%>%
  top_n(7, desc(Time))%>%
  summarize(Average = mean(value))
First7avg$Average <- round(First7avg$Average, 2)
First7avg <- as.data.frame(First7avg)
#repeat for the last 7 data points but replace top_n(7,desc(Time)) with top_n(7, Time)%>%

Затем я объединил каждый набор данных так, чтобы он был структурирован следующим образом:

ID      Variable   FirstPt  LastPt  First5Avg Last5Avg First7Avg Last7Avg First10Avg Last10Avg  
12      Copper     
12      Iron     
12      Carbon     
12       Mg      
12      Lead     
12      CaCO3     
234     Copper    
234     Iron     
234     Carbon     
234      Mg      
234     Lead      
234     CaCO3    

Затем я начал создавать объекты, содержащие числа, которые я хотел сравнить:

#make comparisons grouping all 6 substances by individual:
FirstPtvsLastPt <- dplyr::select(data,c(ID,FirstPt,LastPt))

FirstPtvsLastPt%>%
  group_by(ID)%>%
  summarise(ttest = t.test(FirstPt, LastPt, paired = T)$p.value)

First7AvgvsLast7Avg <- dplyr::select(data,c(ID,First7Avg,Last7Avg))

First7AvgvsLast7Avg%>%
  group_by(ID)%>%
  summarise(ttest = t.test(First7Avg, Last7Avg, paired = T)$p.value)

Я повторял это для каждого сравнения. Я понимаю, что эта часть - обсуждение для другого форума, но для прозрачности в вопросе, на который я хочу ответить, я объясню; Затем, вместо того, чтобы сравнивать наблюдения всех 6 веществ в каждом индивидууме, я использовал Location в качестве переменной группировки (есть несколько Locations индивидуумов, которые могут быть сгруппированы) и провел те же сравнения (первая точка против среднего из первых 7 пунктов, и т. д.) в отдельных веществах:

#example compares the concentration of Mg in the first point and last point
Mg_FirstPtvsLastPt <-
  data%>%
  filter(Variable == "Mg")%>%
  select(c(Location, FirstPt,LastPt))

Mg_FirstPtvsLastPt%>%
  group_by(Location)%>%
  summarise(ttest = t.test(FirstPt, LastPt, paired = T)$p.value)

На этом этапе я много копировал и вставлял и создал тонну новых объектов, каждый из которых имеет похожее имя. Я начинаю беспокоиться о человеческой ошибке, связанной с этим повторяющимся рабочим процессом, но я не знаю лучшего способа сделать это. В конце я бы объединил все p-значения в один фрейм данных рядом с тестом (или сравнением), с которым они связаны. Какой более эффективный и быстрый способ сделать это? Можно ли это сделать с помощью исходного набора данных, чтобы мне не приходилось создавать так много новых объектов? Возможно с пользовательской функцией?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...