Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите, пожалуйста, написать алгоритм для R
Форум врачей-аспирантов > Разделы форума > Медицинская статистика
Olga_
Добрый день.

Помогите, пожалуйста, написать алгоритм для 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


Спасибо!
p2004r
Цитата(Olga_ @ 29.08.2012 - 12:02) *
Добрый день.

Помогите, пожалуйста, написать алгоритм для 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


Спасибо!


Пожалуйста! smile.gif

Я предлагаю посчитать скользящим окном среднее для всех дней в базе. При импорте формата даты первого файла на некоторых системах возможно понадобится переключить локаль (мне в 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]]
Olga_
Спасибо!

У меня вопрос, почему к(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 это значит, что следующая строка, или я ошибаюсь?
p2004r
Цитата(Olga_ @ 29.08.2012 - 18:43) *
Спасибо!

У меня вопрос, почему к(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) Ну что могу сказать, как говорится --- " Хороший программист на фортране, на любом языке напишет программу на фортране" smile.gif. По поводу указанной строчки кода -- это какая то невозможная конструкция

Я не использую циклов в R, и Вам не советую. В R все делается через *apply() операторы. Для использование for() нужна крайне исключительная причина.

Прочитайте пожалуйста руководство "Введение в R" (или на английском, или на русском со страницы перевода http://m7876.wiki.zoho.com/Introduction-to-R.html , а то у меня какое то чувство что я его зря переводил)
Olga_
Цитата(p2004r @ 29.08.2012 - 19:57) *
1) на таких коротких данных я выбрал усреднение по 3 дням (или меньше за счет выбранного алгоритма) чтобы хоть что то работало для отладки.

Программа работает просто --- для всех дней справочника температуры рассчитывается среднее за предыдущие 7 дней (у меня для отладки на Ваших лапидарных примерах таблиц -- за 3 дня).

После этого Вы просто запрашиваете последней строкой из справочника среднюю температуру для даты инцидента.

Скажите куда Вам это среднее надо подставить? И приведите более длинные куски данных. Иначе мне непонятно чем Вас не устраивает предложенное мной решение.

2) Ну что могу сказать, как говорится --- " Хороший программист на фортране, на любом языке напишет программу на фортране" smile.gif. По поводу указанной строчки кода -- это какая то невозможная конструкция

Я не использую циклов в R, и Вам не советую. В R все делается через *apply() операторы. Для использование for() нужна крайне исключительная причина.

Прочитайте пожалуйста руководство "Введение в R" (или на английском, или на русском со страницы перевода http://m7876.wiki.zoho.com/Introduction-to-R.html , а то у меня какое то чувство что я его зря переводил)


Проблема в том, что это в среднем нужно рассчитать температуру за предыдущие семь дней, но это не всегда так. Есть периоды более 7 дней и менее 7 дней. Только для первого измерения всегда нужна средняя температура за предыдущие 7 дней. Меня то как раз рассчитать среднее за 7 дней очень устраивает:)

Я не программист и в R только начала работать. Мои коллеги рекомендовали использовать for для того, чтобы рассчитать среднее...
Почему вы пишите, что для for нужна крайне исключительная причина?

Данные сейчас загружу
Olga_
---
p2004r
Цитата(Olga_ @ 29.08.2012 - 21:17) *
Проблема в том, что это в среднем нужно рассчитать температуру за предыдущие семь дней, но это не всегда так. Есть периоды более 7 дней и менее 7 дней. Только для первого измерения всегда нужна средняя температура за предыдущие 7 дней. Меня то как раз рассчитать среднее за 7 дней очень устраивает:)

Я не программист и в R только начала работать. Мои коллеги рекомендовали использовать for для того, чтобы рассчитать среднее...
Почему вы пишите, что для for нужна крайне исключительная причина?

Данные сейчас загружу


Данные это хорошо. Но:

1) Что значит "менее-более семи дней"?! Вы в первом сообщении написали а) что у Вас база данных температуры именно за _каждый_ день, б) что для каждого инциндента из таблицы случаев надо получить среднюю температуру за предыдущие 7 дней.

2) Объясните структуру своего эксперимента. Типа: "Для каждой строки из таблицы такой то получить то то и то то...". Ну или просто раскажите что надо получитью Иначе мне не понятно как надо группировать данные, и я не смогу Вам помочь.

3) Привет коллегам, они хорошие "программисты на фортране" smile.gif В 95% случаев анализа данных в R for() не нужен (а следовательно , по заветам медицинской статистики не существует smile.gif, именно для этого R и разрабатывали собственно --- что бы избежать низкоуровневого программирования.
Olga_
Цитата(p2004r @ 30.08.2012 - 09:44) *
Данные это хорошо. Но:

1) Что значит "менее-более семи дней"?! Вы в первом сообщении написали а) что у Вас база данных температуры именно за _каждый_ день, б) что для каждого инциндента из таблицы случаев надо получить среднюю температуру за предыдущие 7 дней.

2) Объясните структуру своего эксперимента. Типа: "Для каждой строки из таблицы такой то получить то то и то то...". Ну или просто раскажите что надо получитью Иначе мне не понятно как надо группировать данные, и я не смогу Вам помочь.

3) Привет коллегам, они хорошие "программисты на фортране" smile.gif В 95% случаев анализа данных в R for() не нужен (а следовательно , по заветам медицинской статистики не существует smile.gif, именно для этого R и разрабатывали собственно --- что бы избежать низкоуровневого программирования.

Используя базу данных температуры за каждый день. (файл temp.txt ) нужно рассчитать среднюю температуру для каждого участника исследования (data.txt) за период с момента предыдущего наблюдения до следующего. Обычно разница между наблюдениями составляет 7 дней, но может быть и больше, например, для 1 пациента период между первым наблюдением и вторым
stday
28apr1999
07may1999
Конечно, такие случаи встречаются редко и их можно просто игнорировать, используя предложенную вами методику рассчета (средняя температура за предыдущие 7 дней).
Для первого измерения всегда нужна средняя температура за предыдущие 7 дней.

Одна из целей исследования - оценить влияние факторов окружающей среды (темп., РМ10, О3 и т.д.) на частоту респираторных симптомов в течении 1 года.

p2004r
Цитата(Olga_ @ 30.08.2012 - 12:02) *
Используя базу данных температуры за каждый день. (файл 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

Olga_
Цитата(p2004r @ 30.08.2012 - 14:37) *
Ольга, Вам не кажется что эти данные немного отличаются от первоначальных? Вы не ошиблись с файлом?


Код
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


Нет, сначала , как пример, я привела модифицированные данные, где я обьединила в одну коллонку время исследования.
p2004r
Цитата(Olga_ @ 30.08.2012 - 16:10) *
Нет, сначала , как пример, я привела модифицированные данные, где я обьединила в одну коллонку время исследования.


ну так почему бы и не выкладывать именно рабочий файл, раз уж Вы время привели к вменяемому формату?

ну тогда уж продолжу прошлый "алгоритм":

1) получаем массив средних за 3-14 последних дней на текущую дату (колонку даты возьмете свою smile.gif

Код
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 smile.gif но можно и проще
Код
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 )
Olga_
Цитата(p2004r @ 30.08.2012 - 18:50) *
ну так почему бы и не выкладывать именно рабочий файл, раз уж Вы время привели к вменяемому формату?

ну тогда уж продолжу прошлый "алгоритм":

1) получаем массив средних за 3-14 последних дней на текущую дату (колонку даты возьмете свою smile.gif

Код
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 smile.gif но можно и проще
Код
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_
Что то у меня не получается..

Мой код

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
p2004r
ну а файлы данных запаковать в rar и выложить?
Olga_
Решили оставить вариант с уровнем полютантов за предыдущие 7 дней.


Хотела бы использовать также для анализа время, в моем исследовании это 1 неделя. Но как было отмечено выше, время Исследований имеет неодинаковый промежуток.

1. Сначала, хотела бы создать одинаковые промежутки времени- недели начиная, к примеру с 01.01.1999. Какой это пакет в R? Где то кто то уже рекомендовал этот пакет, но не могу вспомнить

2. Затем интерполировать реальные даты в искусственные промежутки времени.

С помощью какого пакета/пакетов R можно это выполнить?

Спасибо заранее.
p2004r
Цитата(Olga_ @ 6.11.2012 - 18:08) *
Решили оставить вариант с уровнем полютантов за предыдущие 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.

Olga_
Спасибо, я уже сама нашла и создала искусственные промежутки времени, но только как разместить мои реальные даты пока еще не могу понять.
p2004r
Цитата(Olga_ @ 7.11.2012 - 22:10) *
Спасибо, я уже сама нашла и создала искусственные промежутки времени, но только как разместить мои реальные даты пока еще не могу понять.


сначала как мне кажется должен быть создан временной ряд с иррегулярным расстоянием (это Ваш данные). на втором этапе его надо конвертировать в регулярный ряд с нужными отсчетами.
Olga_
Временной ряд уже создан, это все те же данные
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.
p2004r
Цитата(Olga_ @ 8.11.2012 - 22:30) *
Временной ряд уже создан, это все те же данные
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.


не понимаю что Вы пытаетесь сделать smile.gif

ну вот почитайте ?na.approx в zoo, там в примере есть пересчет серии using na.approx to create regularly spaced series
Olga_
У меня 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 функция для пропущенных значений.



p2004r
Ха, какой тонкий тролинг smile.gif

не говорим попусту, а читаем.
Код
## 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)
     }


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.