![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
Добрый день.
Помогите, пожалуйста, написать алгоритм для R. У меня две базы данных, одна из них включает номер пациента, дату каждого измерения (как правило, измерение проводилось в среднем каждуjу неделю в течении 1 года ) и номер недели (1,2,3...54), вторая база включает информацию о ежедневной температуре воздуха. Задача: нужно посчитать среднюю температуру, предшествующую каждому измерению. Например, для первой недели нужно рассчитать среднюю темп за 7 дней до измерения (28apr1999-7дней), для второй недели за период 28apr1999-07may1999 и т.д. FID studydate week 1 28apr1999 1 1 07may1999 2 1 14may1999 3 1 21may1999 4 Second dataset temp date 5.37 1999-04-20 2.13 1999-04-21 1.6 1999-04-22 -0.17 1999-04-23 2.53 1999-04-24 Спасибо! |
|
![]() |
![]() |
![]()
Сообщение
#2
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Добрый день. Помогите, пожалуйста, написать алгоритм для R. У меня две базы данных, одна из них включает номер пациента, дату каждого измерения (как правило, измерение проводилось в среднем каждуjу неделю в течении 1 года ) и номер недели (1,2,3...54), вторая база включает информацию о ежедневной температуре воздуха. Задача: нужно посчитать среднюю температуру, предшествующую каждому измерению. Например, для первой недели нужно рассчитать среднюю темп за 7 дней до измерения (28apr1999-7дней), для второй недели за период 28apr1999-07may1999 и т.д. FID studydate week 1 28apr1999 1 1 07may1999 2 1 14may1999 3 1 21may1999 4 Second dataset temp date 5.37 1999-04-20 2.13 1999-04-21 1.6 1999-04-22 -0.17 1999-04-23 2.53 1999-04-24 Спасибо! Пожалуйста! ![]() Я предлагаю посчитать скользящим окном среднее для всех дней в базе. При импорте формата даты первого файла на некоторых системах возможно понадобится переключить локаль (мне в utf8 понадобилось). Примеры слишком короткие для демонстрации работоспособности. Код > temp.time<-read.table("time.txt", header=TRUE)
> temp.time$date<-as.Date(temp.time$date) > str(temp.time) 'data.frame': 5 obs. of 2 variables: $ temp: num 5.37 2.13 1.6 -0.17 2.53 $ date:Class 'Date' num [1:5] 10701 10702 10703 10704 10705 > > library(caTools) > temp.time <- data.frame(temp.time, avgtemp=runmean(temp.time$temp, 3, alg= "exact", endrule="mean", align = "right")) > temp.time temp date avgtemp 1 5.37 1999-04-20 3.750000 2 2.13 1999-04-21 3.750000 3 1.60 1999-04-22 3.033333 4 -0.17 1999-04-23 1.186667 5 2.53 1999-04-24 1.320000 > lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C") > data<-read.table("data.txt", header=TRUE) > data$studydate<-as.Date(data$studydate, "%d%b%Y") > data FID studydate week 1 1 1999-04-28 1 2 1 1999-05-07 2 3 1 1999-05-14 3 4 1 1999-05-21 4 > str(data) 'data.frame': 4 obs. of 3 variables: $ FID : int 1 1 1 1 $ studydate:Class 'Date' num [1:4] 10709 10718 10725 10732 $ week : int 1 2 3 4 > Sys.setlocale("LC_TIME", lct) > temp.time$avgtemp[temp.time$date==data[1,2]] ![]() |
|
![]() |
![]() |
![]()
Сообщение
#3
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
Спасибо!
У меня вопрос, почему к(width of moving window)=3? Не совсем поняла, как работает предложенный вами метод.. Я думала, что нужно написать loop для решения этой задачи. Но мои попытки не дали желаемого результата.. airpollution <- read.table("C:.../Pay.csv",blank.lines.skip = TRUE,fill=T,header=T,sep=";") summary(airpollution) dat <- paste(airpollution[,3],"-",airpollution[,2],"-",airpollution[,1],sep="") dat <- as.Date(dat, format="%Y-%m-%d") pay <- cbind(airpollution,dat) x <- read.dta("C:/.../symptoms.dta") x$stday <- as.Date(x$stday, origin="1960-01-01",format="%Y-%m-%d") temp<- rep(NA, length(x$FID)) index <- 1:length(pay$dat) pm10<- rep(NA, length(x$FID)) for (i in 1:length(x$FID)) { start <- x$stday[i]==pay$dat s <- index[start] end <- x$stday[i]+1==pay$dat e <- index[end] pm10[i] <- mean(pay$pm10[s:e],na.rm = T) paytemp[i] <- mean(pay$temp[s:e],na.rm = T) } Не уверена насчет этой части end <- x$stday[i]+1==pay$dat +1 это значит, что следующая строка, или я ошибаюсь? |
|
![]() |
![]() |
![]()
Сообщение
#4
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Спасибо! У меня вопрос, почему к(width of moving window)=3? Не совсем поняла, как работает предложенный вами метод.. Я думала, что нужно написать loop для решения этой задачи. Но мои попытки не дали желаемого результата.. airpollution <- read.table("C:.../Pay.csv",blank.lines.skip = TRUE,fill=T,header=T,sep=";") summary(airpollution) dat <- paste(airpollution[,3],"-",airpollution[,2],"-",airpollution[,1],sep="") dat <- as.Date(dat, format="%Y-%m-%d") pay <- cbind(airpollution,dat) x <- read.dta("C:/.../symptoms.dta") x$stday <- as.Date(x$stday, origin="1960-01-01",format="%Y-%m-%d") temp<- rep(NA, length(x$FID)) index <- 1:length(pay$dat) pm10<- rep(NA, length(x$FID)) for (i in 1:length(x$FID)) { start <- x$stday[i]==pay$dat s <- index[start] end <- x$stday[i]+1==pay$dat e <- index[end] pm10[i] <- mean(pay$pm10[s:e],na.rm = T) paytemp[i] <- mean(pay$temp[s:e],na.rm = T) } Не уверена насчет этой части end <- x$stday[i]+1==pay$dat +1 это значит, что следующая строка, или я ошибаюсь? 1) на таких коротких данных я выбрал усреднение по 3 дням (или меньше за счет выбранного алгоритма) чтобы хоть что то работало для отладки. Программа работает просто --- для всех дней справочника температуры рассчитывается среднее за предыдущие 7 дней (у меня для отладки на Ваших лапидарных примерах таблиц -- за 3 дня). После этого Вы просто запрашиваете последней строкой из справочника среднюю температуру для даты инцидента. Скажите куда Вам это среднее надо подставить? И приведите более длинные куски данных. Иначе мне непонятно чем Вас не устраивает предложенное мной решение. 2) Ну что могу сказать, как говорится --- " Хороший программист на фортране, на любом языке напишет программу на фортране" ![]() Я не использую циклов в R, и Вам не советую. В R все делается через *apply() операторы. Для использование for() нужна крайне исключительная причина. Прочитайте пожалуйста руководство "Введение в R" (или на английском, или на русском со страницы перевода http://m7876.wiki.zoho.com/Introduction-to-R.html , а то у меня какое то чувство что я его зря переводил) ![]() |
|
![]() |
![]() |
![]()
Сообщение
#5
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
1) на таких коротких данных я выбрал усреднение по 3 дням (или меньше за счет выбранного алгоритма) чтобы хоть что то работало для отладки. Программа работает просто --- для всех дней справочника температуры рассчитывается среднее за предыдущие 7 дней (у меня для отладки на Ваших лапидарных примерах таблиц -- за 3 дня). После этого Вы просто запрашиваете последней строкой из справочника среднюю температуру для даты инцидента. Скажите куда Вам это среднее надо подставить? И приведите более длинные куски данных. Иначе мне непонятно чем Вас не устраивает предложенное мной решение. 2) Ну что могу сказать, как говорится --- " Хороший программист на фортране, на любом языке напишет программу на фортране" ![]() Я не использую циклов в R, и Вам не советую. В R все делается через *apply() операторы. Для использование for() нужна крайне исключительная причина. Прочитайте пожалуйста руководство "Введение в R" (или на английском, или на русском со страницы перевода http://m7876.wiki.zoho.com/Introduction-to-R.html , а то у меня какое то чувство что я его зря переводил) Проблема в том, что это в среднем нужно рассчитать температуру за предыдущие семь дней, но это не всегда так. Есть периоды более 7 дней и менее 7 дней. Только для первого измерения всегда нужна средняя температура за предыдущие 7 дней. Меня то как раз рассчитать среднее за 7 дней очень устраивает:) Я не программист и в R только начала работать. Мои коллеги рекомендовали использовать for для того, чтобы рассчитать среднее... Почему вы пишите, что для for нужна крайне исключительная причина? Данные сейчас загружу |
|
![]() |
![]() |
![]()
Сообщение
#6
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
---
Сообщение отредактировал Olga_ - 8.11.2012 - 22:35 |
|
![]() |
![]() |
![]()
Сообщение
#7
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Проблема в том, что это в среднем нужно рассчитать температуру за предыдущие семь дней, но это не всегда так. Есть периоды более 7 дней и менее 7 дней. Только для первого измерения всегда нужна средняя температура за предыдущие 7 дней. Меня то как раз рассчитать среднее за 7 дней очень устраивает:) Я не программист и в R только начала работать. Мои коллеги рекомендовали использовать for для того, чтобы рассчитать среднее... Почему вы пишите, что для for нужна крайне исключительная причина? Данные сейчас загружу Данные это хорошо. Но: 1) Что значит "менее-более семи дней"?! Вы в первом сообщении написали а) что у Вас база данных температуры именно за _каждый_ день, б) что для каждого инциндента из таблицы случаев надо получить среднюю температуру за предыдущие 7 дней. 2) Объясните структуру своего эксперимента. Типа: "Для каждой строки из таблицы такой то получить то то и то то...". Ну или просто раскажите что надо получитью Иначе мне не понятно как надо группировать данные, и я не смогу Вам помочь. 3) Привет коллегам, они хорошие "программисты на фортране" ![]() ![]() ![]() |
|
![]() |
![]() |
![]()
Сообщение
#8
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
Данные это хорошо. Но: 1) Что значит "менее-более семи дней"?! Вы в первом сообщении написали а) что у Вас база данных температуры именно за _каждый_ день, б) что для каждого инциндента из таблицы случаев надо получить среднюю температуру за предыдущие 7 дней. 2) Объясните структуру своего эксперимента. Типа: "Для каждой строки из таблицы такой то получить то то и то то...". Ну или просто раскажите что надо получитью Иначе мне не понятно как надо группировать данные, и я не смогу Вам помочь. 3) Привет коллегам, они хорошие "программисты на фортране" ![]() ![]() Используя базу данных температуры за каждый день. (файл temp.txt ) нужно рассчитать среднюю температуру для каждого участника исследования (data.txt) за период с момента предыдущего наблюдения до следующего. Обычно разница между наблюдениями составляет 7 дней, но может быть и больше, например, для 1 пациента период между первым наблюдением и вторым stday 28apr1999 07may1999 Конечно, такие случаи встречаются редко и их можно просто игнорировать, используя предложенную вами методику рассчета (средняя температура за предыдущие 7 дней). Для первого измерения всегда нужна средняя температура за предыдущие 7 дней. Одна из целей исследования - оценить влияние факторов окружающей среды (темп., РМ10, О3 и т.д.) на частоту респираторных симптомов в течении 1 года. |
|
![]() |
![]() |
![]()
Сообщение
#9
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Используя базу данных температуры за каждый день. (файл temp.txt ) нужно рассчитать среднюю температуру для каждого участника исследования (data.txt) за период с момента предыдущего наблюдения до следующего. Обычно разница между наблюдениями составляет 7 дней, но может быть и больше, например, для 1 пациента период между первым наблюдением и вторым stday 28apr1999 07may1999 Конечно, такие случаи встречаются редко и их можно просто игнорировать, используя предложенную вами методику рассчета (средняя температура за предыдущие 7 дней). Для первого измерения всегда нужна средняя температура за предыдущие 7 дней. Одна из целей исследования - оценить влияние факторов окружающей среды (темп., РМ10, О3 и т.д.) на частоту респираторных симптомов в течении 1 года. Ольга, Вам не кажется что эти данные немного отличаются от первоначальных? Вы не ошиблись с файлом? Код day month year temp temp_min temp_max 1 1 1998 1.15 2 1 1998 6.64 3 1 1998 6.01 4 1 1998 6.16 5 1 1998 7.55 6 1 1998 6.36 7 1 1998 8.13 8 1 1998 7.66 9 1 1998 2.42 ![]() |
|
![]() |
![]() |
![]()
Сообщение
#10
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
Ольга, Вам не кажется что эти данные немного отличаются от первоначальных? Вы не ошиблись с файлом? Код day month year temp temp_min temp_max 1 1 1998 1.15 2 1 1998 6.64 3 1 1998 6.01 4 1 1998 6.16 5 1 1998 7.55 6 1 1998 6.36 7 1 1998 8.13 8 1 1998 7.66 9 1 1998 2.42 Нет, сначала , как пример, я привела модифицированные данные, где я обьединила в одну коллонку время исследования. |
|
![]() |
![]() |
![]()
Сообщение
#11
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Нет, сначала , как пример, я привела модифицированные данные, где я обьединила в одну коллонку время исследования. ну так почему бы и не выкладывать именно рабочий файл, раз уж Вы время привели к вменяемому формату? ну тогда уж продолжу прошлый "алгоритм": 1) получаем массив средних за 3-14 последних дней на текущую дату (колонку даты возьмете свою ![]() Код tmp<-sapply(1:10, function(i) avgtemp=runmean(temp.time$temp, i+3, alg= "exact", endrule="mean", align = "right") ) 2) разницу между текущим обследованием и предыдущим получаем Код > data<-read.table("data.txt", header=TRUE) > data$stday<-as.Date(data$stday, "%d%b%Y") > head(data) FID stday woche 1 1 1999-04-28 1 2 1 1999-05-07 2 3 1 1999-05-14 3 4 1 1999-05-21 4 5 1 1999-05-27 5 6 1 1999-06-04 6 > head(diff(data$stday)) Time differences in days [1] 9 7 7 6 8 7 Эти данные имеют на один день меньше, и их надо дополнить NA вначале если присоединять в data. 3) Берем из diff(data$stday)[i+1] где i номер строки из data имеющий смысл и получаем номер столбца скользящей средней температуры: tmp[,diff(data$stday)[i+1]] 4) Теперь вставляем выборку даты data$stday[i]==temp$day, получаем итоговую конструкцию tmp[ data$stday[i]==temp$day , diff(data$stday)[i+1] ] которая по i тому номеру строки из первой таблицы возвращает среднюю температуру за предыдущий период 5) осмысленные строки -- по красивому надо написать агрегирующую функцию в plyr ![]() Код sapply(2:nrow(data), function(i) if(data[i,1]==data[i-1,1]) tmp[ data$stday[i]==temp$day , diff(data$stday)[i+1] ] else NA )
Сообщение отредактировал p2004r - 30.08.2012 - 19:53 ![]() |
|
![]() |
![]() |
![]()
Сообщение
#12
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
ну так почему бы и не выкладывать именно рабочий файл, раз уж Вы время привели к вменяемому формату? ну тогда уж продолжу прошлый "алгоритм": 1) получаем массив средних за 3-14 последних дней на текущую дату (колонку даты возьмете свою ![]() Код tmp<-sapply(1:10, function(i) avgtemp=runmean(temp.time$temp, i+3, alg= "exact", endrule="mean", align = "right") ) 2) разницу между текущим обследованием и предыдущим получаем Код > data<-read.table("data.txt", header=TRUE) > data$stday<-as.Date(data$stday, "%d%b%Y") > head(data) FID stday woche 1 1 1999-04-28 1 2 1 1999-05-07 2 3 1 1999-05-14 3 4 1 1999-05-21 4 5 1 1999-05-27 5 6 1 1999-06-04 6 > head(diff(data$stday)) Time differences in days [1] 9 7 7 6 8 7 Эти данные имеют на один день меньше, и их надо дополнить NA вначале если присоединять в data. 3) Берем из diff(data$stday)[i+1] где i номер строки из data имеющий смысл и получаем номер столбца скользящей средней температуры: tmp[,diff(data$stday)[i+1]] 4) Теперь вставляем выборку даты data$stday[i]==temp$day, получаем итоговую конструкцию tmp[ data$stday[i]==temp$day , diff(data$stday)[i+1] ] которая по i тому номеру строки из первой таблицы возвращает среднюю температуру за предыдущий период 5) осмысленные строки -- по красивому надо написать агрегирующую функцию в plyr ![]() Код sapply(2:nrow(data), function(i) if(data[i,1]==data[i-1,1]) tmp[ data$stday[i]==temp$day , diff(data$stday)[i+1] ] else NA ) Огромное спасибо! То что я хотела, но никак не могла выразить из-за недостатка знаний в R. Вы, конечно, правы, нужно сначала читать, а потом еще перечитывать. Мне кажется, что вы меня уже не в первый раз выручаете. Как то регестрировалась я на одном форуме биологов н- ное время назад... Вчера файлы никак загружались, выложила, те файлы, которые удалось загрузить. Сообщение отредактировал Olga_ - 30.08.2012 - 21:17 |
|
![]() |
![]() |
![]()
Сообщение
#13
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
Что то у меня не получается..
Мой код airpollution <- read.table("...Payerne.csv",blank.lines.skip = TRUE,fill=T,header=T,sep=";") summary(airpollution) day <- paste(airpollution[,3],"-",airpollution[,2],"-",airpollution[,1],sep="") day <- as.Date(day, format="%Y-%m-%d") payerne <- cbind(airpollution,day) tmp<-sapply(1:10, function(i) avgtemp=runmean(payerne$temp, i+3, alg= "exact", endrule="mean", align = "right") ) data<- read.dta("...symptoms.dta") data$stday<-as.Date(data$stday, "%d%b%Y") head(diff(data$stday)) sapply(2:nrow(data), function(i) if(data[i,1]==data[i-1,1]) tmp[ data$stday[i]==payerne$day , diff(data$stday)[i+1] ] else NA ) Error in FUN(2:20426[[177L]], ...) : subscript out of bounds Сообщение отредактировал Olga_ - 11.09.2012 - 11:51 |
|
![]() |
![]() |
![]()
Сообщение
#14
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
ну а файлы данных запаковать в rar и выложить?
![]() |
|
![]() |
![]() |
![]()
Сообщение
#15
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
Решили оставить вариант с уровнем полютантов за предыдущие 7 дней.
Хотела бы использовать также для анализа время, в моем исследовании это 1 неделя. Но как было отмечено выше, время Исследований имеет неодинаковый промежуток. 1. Сначала, хотела бы создать одинаковые промежутки времени- недели начиная, к примеру с 01.01.1999. Какой это пакет в R? Где то кто то уже рекомендовал этот пакет, но не могу вспомнить 2. Затем интерполировать реальные даты в искусственные промежутки времени. С помощью какого пакета/пакетов R можно это выполнить? Спасибо заранее. Сообщение отредактировал Olga_ - 6.11.2012 - 18:09 |
|
![]() |
![]() |
![]()
Сообщение
#16
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Решили оставить вариант с уровнем полютантов за предыдущие 7 дней. Хотела бы использовать также для анализа время, в моем исследовании это 1 неделя. Но как было отмечено выше, время Исследований имеет неодинаковый промежуток. 1. Сначала, хотела бы создать одинаковые промежутки времени- недели начиная, к примеру с 01.01.1999. Какой это пакет в R? Где то кто то уже рекомендовал этот пакет, но не могу вспомнить 2. Затем интерполировать реальные даты в искусственные промежутки времени. С помощью какого пакета/пакетов R можно это выполнить? Спасибо заранее. Например. The zoo package provides infrastructure for regularly and irregularly spaced time series using arbitrary classes for the time stamps (i.e., allowing all classes from the previous section). It is designed to be as consistent as possible with "ts". Coercion from and to "zoo" is available for all other classes mentioned in this section. ![]() |
|
![]() |
![]() |
![]()
Сообщение
#17
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
Спасибо, я уже сама нашла и создала искусственные промежутки времени, но только как разместить мои реальные даты пока еще не могу понять.
|
|
![]() |
![]() |
![]()
Сообщение
#18
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Спасибо, я уже сама нашла и создала искусственные промежутки времени, но только как разместить мои реальные даты пока еще не могу понять. сначала как мне кажется должен быть создан временной ряд с иррегулярным расстоянием (это Ваш данные). на втором этапе его надо конвертировать в регулярный ряд с нужными отсчетами. ![]() |
|
![]() |
![]() |
![]()
Сообщение
#19
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
Временной ряд уже создан, это все те же данные
FID stday week 1 28apr1999 1 1 07may1999 2 1 14may1999 3 1 21may1999 4 1 27may1999 5 1 04jun1999 6 1 11jun1999 7 1 18jun1999 8 1 25jun1999 9 1 02jul1999 10 1 09jul1999 11 1 16jul1999 12 1 23jul1999 13 1 30jul1999 14 1 06aug1999 15 1 13aug1999 16 1 20aug1999 17 1 27aug1999 18 1 03sep1999 19 1 10sep1999 20 1 17sep1999 21 > summary(data$stday) Min. 1st Qu. Median Mean 3rd Qu. Max. "1999-04-28" "2003-08-26" "2005-12-20" "2006-02-11" "2009-01-13" "2012-02-23" > y<-zooreg(seq(1,,length=676),as.Date(data$stday,format="%Y-%m-%d"),start=as.Date("1999-04-28"),end=as.Date("2012-02-23"),freq=1,deltat=7) > y[500:505] 2008-11-19 2008-11-26 2008-12-03 2008-12-10 2008-12-17 2008-12-24 500 501 502 503 504 505 Или же другой вариант y0<-zoo(seq(1,,length=676),as.Date(data$stday,format="%Y-%m-%d")) Warning message: In zoo(rval[i], index(x)[i]) : some methods for ?zoo? objects do not work if the index entries in ?order.by? are not unique > y0[500:505] 2000-02-21 2000-02-21 2000-02-21 2000-02-21 2000-02-21 2000-02-21 194 298 503 557 606 185 > data$stday[500:505] [1] "2000-01-31" "2000-02-07" "2000-02-14" "2000-02-21" "2000-02-28" [6] "2000-03-06" Результаты мне кажутся сомнительными... Не понимаю, как решить эту задачку и есть ли решение в R. Сообщение отредактировал Olga_ - 8.11.2012 - 22:34 |
|
![]() |
![]() |
![]()
Сообщение
#20
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Временной ряд уже создан, это все те же данные FID stday week 1 28apr1999 1 1 07may1999 2 1 14may1999 3 1 21may1999 4 1 27may1999 5 1 04jun1999 6 1 11jun1999 7 1 18jun1999 8 1 25jun1999 9 1 02jul1999 10 1 09jul1999 11 1 16jul1999 12 1 23jul1999 13 1 30jul1999 14 1 06aug1999 15 1 13aug1999 16 1 20aug1999 17 1 27aug1999 18 1 03sep1999 19 1 10sep1999 20 1 17sep1999 21 > summary(data$stday) Min. 1st Qu. Median Mean 3rd Qu. Max. "1999-04-28" "2003-08-26" "2005-12-20" "2006-02-11" "2009-01-13" "2012-02-23" > y<-zooreg(seq(1,,length=676),as.Date(data$stday,format="%Y-%m-%d"),start=as.Date("1999-04-28"),end=as.Date("2012-02-23"),freq=1,deltat=7) > y[500:505] 2008-11-19 2008-11-26 2008-12-03 2008-12-10 2008-12-17 2008-12-24 500 501 502 503 504 505 Или же другой вариант y0<-zoo(seq(1,,length=676),as.Date(data$stday,format="%Y-%m-%d")) Warning message: In zoo(rval[i], index(x)[i]) : some methods for ?zoo? objects do not work if the index entries in ?order.by? are not unique > y0[500:505] 2000-02-21 2000-02-21 2000-02-21 2000-02-21 2000-02-21 2000-02-21 194 298 503 557 606 185 > data$stday[500:505] [1] "2000-01-31" "2000-02-07" "2000-02-14" "2000-02-21" "2000-02-28" [6] "2000-03-06" Результаты мне кажутся сомнительными... Не понимаю, как решить эту задачку и есть ли решение в R. не понимаю что Вы пытаетесь сделать ![]() ну вот почитайте ?na.approx в zoo, там в примере есть пересчет серии using na.approx to create regularly spaced series ![]() |
|
![]() |
![]() |
![]()
Сообщение
#21
|
|
Группа: Пользователи Сообщений: 43 Регистрация: 4.01.2012 Пользователь №: 23400 ![]() |
У меня time series data с нерегулярными интервалами времени. Я хочу организовать мои данные таким образом, чтобы каждый пациент имел 1 измерение в неделю, в среднем у каждого пациента было 52 измерения, то есть каждую неделю в течении года. Поэтому встречаюся повторные измерения в один и тот же день (исследовали сразу несколько пациентов).
id stday week 1 28apr1999 1 1 07may1999 2 1 14may1999 3 1 21may1999 4 1 27may1999 5 1 04jun1999 6 1 11jun1999 7 1 18jun1999 8 1 25jun1999 9 1 02jul1999 10 1 09jul1999 11 1 16jul1999 12 1 23jul1999 13 1 30jul1999 14 1 06aug1999 15 Конечные данные должны выглыдеть так id week day 1 1 25.04.99 1 2 02.05.99 1 3 09.05.99 1 4 16.05.99 1 5 23.05.99 1 6 30.05.99 1 7 06.06.99 1 8 13.06.99 1 9 20.06.99 1 10 27.06.99 1 11 04.07.99 1 12 11.07.99 1 12 11.07.99 2 12 11.07.99 6 12 11.07.99 9 12 11.07.99 Здесь каждый пациент имел и измерение каждое воскресение, данные были организованы в matlab, которого у меня на данный момент нет, да и как работать в матлабе имею смутное представление.. na.approx функция для пропущенных значений. |
|
![]() |
![]() |
![]()
Сообщение
#22
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Ха, какой тонкий тролинг
![]() не говорим попусту, а читаем. Код ## using na.approx for disaggregation zy <- zoo(1:3, 2000:2001) # yearly to monthly series zmo <- na.approx(zy, xout = as.yearmon(2000+0:13/12)) zmo # monthly to daily series sq <- seq(as.Date(start(zmo)), as.Date(end(zmo), frac = 1), by = "day") zd <- na.approx(zmo, x = as.Date, xout = sq) head(zd) # weekly to daily series zww <- zoo(1:3, as.Date("2001-01-01") + seq(0, length = 3, by = 7)) zww zdd <- na.approx(zww, xout = seq(start(zww), end(zww), by = "day")) zdd и Код # using na.approx to create regularly spaced series # z has points at 10, 20 and 40 minutes while output also has a point at 30 if(require("chron")) { tt <- as.chron("2000-01-01 10:00:00") + c(1, 2, 4) * as.numeric(times("00:10:00")) z <- zoo(1:3, tt) tseq <- seq(start(z), end(z), by = times("00:10:00")) na.approx(z, xout = tseq) } ![]() |
|
![]() |
![]() |
![]() ![]() |