Если вам известен пример набора данных, который будет полезен при ответе на этот вопрос, это приветствуется. Предположим, у меня есть фрейм данных, который имеет следующую структуру:
>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-значения в один фрейм данных рядом с тестом (или сравнением), с которым они связаны. Какой более эффективный и быстрый способ сделать это? Можно ли это сделать с помощью исходного набора данных, чтобы мне не приходилось создавать так много новых объектов? Возможно с пользовательской функцией?