несколько графиков из фреймов данных в списке после условного теста

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

Мой набор данных включает 30 различных антибиотиков с интенсивностью использования, которые собираются ежемесячно в течение 5 лет. Он имеет 3 столбца и 1692 строки.

До сих пор я составил список отдельных фреймов данных для каждого класса антибиотиков. (Название списка — «лекарство», а «лекарство.класс» — вектор символов названий лекарств из исходного фрейма данных)

drugList <- list()
n<-length(drug.class)
for (i in 1:n){
  drugList[[i]] <-AB[Drug==(drug.class[i]),]
}

Например, у меня есть 30 фреймов данных в списке со следующими столбцами:

[[29]]
           Drug  Usage      DateA
1353 Tobramycin  5.06 01-Jan-2006
1354 Tobramycin  4.21 01-Feb-2006
1355 Tobramycin  6.34 01-Mar-2006
.
.
. 
          Drug  Usage       DateA
678 Vancomycin  11.62 01-Jan-2006
679 Vancomycin  11.94 01-Feb-2006
680 Vancomycin  14.29 01-Mar-2006

Перед созданием каждого графика выполняется логический тест, чтобы определить, является ли временной ряд автокоррелированным. Фреймы данных в списке имеют очень большую длину. Я написал функцию для выполнения теста следующим образом:

acTest <- function(){
    id<-ts(1:length(DateA))
    a1<-ts(Usage)
    a2<-lag(a1-1)
    tg<-ts.union(a1,id,a2)
    mg<-lm(a1~a2+bs(id,df=3), data=tg)
    a2Pval <- summary(mg)$coefficients[2, 4]
    if (a2Pval<=0.05) {
        TRUE
    } else {
        FALSE
    }
}

Ранее я тестировал все свои функции на отдельных фреймах данных, и они работают так, как ожидалось.

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

Заранее благодарим за любую предложенную помощь.


person John    schedule 06.07.2011    source источник


Ответы (1)


Несколько предложений:

Измените свою функцию acTest так, чтобы она фактически принимала data.frame в качестве параметра. В противном случае у вас будет много проблем с функцией, ищущей (и изменяющей) объекты с именами DateA и Usage в глобальной среде.

acTest <- function(dat){
    id<-ts(1:length(dat$DateA))
    a1<-ts(dat$Usage)
    a2<-lag(a1-1)
    tg<-ts.union(a1,id,a2)
    mg<-lm(a1~a2+bs(id,df=3), data=tg)
    a2Pval <- summary(mg)$coefficients[2, 4]
    if (a2Pval<=0.05) {
        TRUE
    } else {
        FALSE
    }
}

Применение функции к каждому элементу списка — обычная задача в R. Это (чаще всего) выполняется с помощью lapply.

lapply(drugList,FUN=acTest)

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

ddply(AB,.(Drug),.fun = acTest)
person joran    schedule 06.07.2011
comment
Спасибо Джоран. Работает отлично. - person John; 06.07.2011