2017-10-09 2 views
1

다른 사람들의 생체 인식 시계열 데이터를 가지고 있으며 동물원 패키지를 사용하여 데이터를 저장하고 있습니다. 장난감 예 :R - 시계열에 그룹/조건 변수 추가

library(zoo) 
w1 <- sin(seq(0,20,0.25)) 
w2 <- cos(seq(0,20,0.25)) 
df <- data.frame(w1,w1,w1,w2,w2,w2) 
names(df) <- paste("waves", 1:6, sep="") 
waves <- zoo(df) 

그러나 각 개인에 대한 추가 그룹/조건 변수 (예 : 연령, 성별, 건강 상태)가 있습니다. 그래서 지금 건강한 사람들의 파형으로 무언가를 할 필요가 있다면 상상해보십시오.

내가 이해 한 바로는 동물원이나 xts 객체는 추가 변수를 허용하지 않습니다. 그래서 내 계획은 이러한 추가 변수에 대한 조회 데이터 프레임을 유지하는 것이 었습니다. 예를 들면 : 나는 건강한 사람을 샘플링해야하는 경우 이제

lookup <- data.frame(index = paste("waves", 1:6, sep=""), 
        group = c("healthy", "unhealthy")) 

은, 내가 할 수있는 :

select <- waves[, lookup$index[lookup$group=="healthy"]] 

시계열 + 추가 변수를 관리 할 수있는 더 좋은 방법이나 데이터 구조가 있습니까?

+0

당신은 여기에'data.table'를 사용할 수 있습니다. – agstudy

답변

1

당신이 찾고있는 것은 패널 데이터 구조입니다. 횡단면 시계열 데이터라고도하는 패널 데이터는 시간에 따라뿐만 아니라 요소에 따라 달라지는 데이터입니다. 귀하의 경우 wavesvalue은 각 엔티티에서 시간에 따라 다르지만 group은 엔티티에 따라 다릅니다. 일반적인 패널 데이터 형식을 얻으려면 간단한 gatherjoin을 사용할 수 있습니다. 여기

library(tidyr) 
library(dplyr) 
panel_df = df %>% 
    gather(index, value) %>% 
    inner_join(lookup, by = "index") %>% 
    group_by(index) %>% 
    mutate(time = 1:n()) 

#  index  value group time 
#  <chr>  <dbl> <chr> <int> 
# 1 waves1 0.0000000 healthy  1 
# 2 waves1 0.2474040 healthy  2 
# 3 waves1 0.4794255 healthy  3 
# 4 waves1 0.6816388 healthy  4 
# 5 waves1 0.8414710 healthy  5 
# 6 waves1 0.9489846 healthy  6 
# 7 waves1 0.9974950 healthy  7 
# 8 waves1 0.9839859 healthy  8 
# 9 waves1 0.9092974 healthy  9 
# 10 waves1 0.7780732 healthy 10 
# # ... with 476 more rows 

, index은 개체 차원을 나타내며, 나는 수동으로 패널 데이터의 시간 차원을 나타 내기 위해 time 변수를 만들었습니다.

library(ggplot2) 
# Visualize all waves, grouped by health status 
ggplot(panel_df, aes(x = time, y = value, group = index)) + 
    geom_line(aes(color = group)) 

enter image description here

# Only Healthy people 
panel_df %>% 
    filter(group == "healthy") %>% 
    ggplot(aes(x = time, y = value, color = index)) + 
    geom_line() 

# Compare healthy and unhealthy people's waves 
panel_df %>% 
    ggplot(aes(x = time, y = value, color = index)) + 
    geom_line() + 
    facet_grid(. ~ group) 

enter image description here

시간 차원 작업 :

# plot acf for each entity `value` time series 
par(mfrow = c(3, 2)) 
by(panel_df$value, panel_df$index, function(x) acf(x)) 
012,351,641

당신이 ggplot2와 함께 다음과 같은 일을 할 수있는 패널 데이터를 시각화하는 방법 마지막

enter image description here

library(forecast) 
panel_df %>% 
    filter(index == "waves1") %>% 
    {autoplot(acf(.$value))} 

enter image description here

상기 plm 패키지는 패널 데이터와 협력 우수하다. 계량 경제학의 다양한 패널 회귀 모델이 구현되었지만이 답변을 더 이상 만들지 않기 위해 나는 자체 연구를위한 몇 가지 링크를 남겨 둘 것입니다. pdim는 패널 데이터의 당신에게 개체 및 시간 차원을 이야기하며 균형 여부 :

library(plm) 
# Check dimension of Panel 
pdim(panel_df, index = c("index", "time")) 
# Balanced Panel: n=6, T=81, N=486 
  1. What is Panel Data?
  2. Getting Started in Fixed/Random Effects Models using R
  3. Regressions with Panel Data

나는 더 나은 데이터를 수정 한 데모.

은 데이터 :

library(zoo) 
w1 <- sin(seq(0,20,0.25)) 
w2 <- cos(seq(0,20,0.25)) 
w3 = w1*2 
w4 = w2*0.5 
w5 = w1*w2 
w6 = w2^2 

df <- data.frame(w1,w2,w3,w4,w5,w6, stringsAsFactors = FALSE) 
names(df) <- paste("waves", 1:6, sep="") 
waves <- zoo(df) 

lookup <- data.frame(index = paste("waves", 1:6, sep=""), 
        group = c("healthy", "unhealthy"), 
        stringsAsFactors = FALSE) 
+0

와우. 매우 상세하고 유용한 답변을 주셔서 감사합니다. 정말 감사! – Runic

관련 문제