2016-12-27 20 views
1

異なる気温の人で実験した2つのデータセットがあります。 P1は、患者の生理学的応答データを表し、P1IAQは、実験中の環境モニタリングデータを表す。 P1はデータを1秒間に32回記録したが、P1IAQは10秒ごとに記録した。2つのtimeseriesデータセットを同期化してプロットするR

head(P1IAQ) 
    Time RH Temp CO2 
1 12:04:07 44.2 19.89 664 
2 12:04:17 44.2 19.89 664 
3 12:04:27 44.2 19.89 665 
4 12:04:37 44.2 19.89 665 
5 12:04:47 44.2 19.89 666 
6 12:04:57 44.2 19.89 668 

head(P1) 
     Time SkinTemp HeartRate RespirationRate 
1 00:00:00 27.781  70    10 
2 00:00:00 27.780  70    10 
3 00:00:00 27.779  70    10 
4 00:00:00 27.779  70    10 
5 00:00:00 27.778  70    10 
6 00:00:00 27.777  70    10 

問題は、P1のタイムスタンプが間違っていることです。環境温度が下がった後、SkinTempがタイムラグを持っているかどうかを同じグラフ上に一緒にプロットする方法はありますか? Skin Temp Ambient Temp

編集:私は環境データの最初の20個の値を追加しましたP1IAQ ためdput。最高のことは、すべての値から12:04:07を差し引いて開始時刻00:00:00にすることです。私はlubridateを見てみました。

library(lubridate) 
P1IAQ$Time<-hms(P1IAQ$Time) 

このdatetimeポストは面白そうですが、日付をプロットするのではなく、実際に変更することです。 Plotting data against time in R

dput(P1IAQ) 
structure(list(Time = structure(1:19, .Label = c("12:04:07", 
"12:04:17", "12:04:27", "12:04:37", "12:04:47", "12:04:57", "12:05:07", 
"12:05:17", "12:05:27", "12:05:37", "12:05:47", "12:05:57", "12:06:07", 
"12:06:17", "12:06:27", "12:06:37", "12:06:47", "12:06:57", "12:07:07" 
), class = "factor"), RH = c(44.2, 44.2, 44.2, 44.2, 44.2, 44.2, 
44.2, 44.2, 44.1, 44.1, 44.2, 44.2, 44.2, 44.3, 44.2, 44.2, 44.2, 
44.3, 44.3), Temp = c(19.89, 19.89, 19.89, 19.89, 19.89, 19.89, 
19.89, 19.89, 19.89, 19.89, 19.94, 19.89, 19.94, 19.94, 19.94, 
19.94, 19.94, 19.94, 19.94), CO2 = c(664L, 664L, 665L, 665L, 
666L, 668L, 668L, 669L, 667L, 670L, 670L, 672L, 675L, 677L, 682L, 
684L, 685L, 686L, 687L)), .Names = c("Time", "RH", "Temp", "CO2" 
), class = "data.frame", row.names = c(NA, -19L)) 

編集:私はlubridateを使っ回同期しました:

P1IAQ$Time<-period_to_seconds(hms(as.character(P1IAQ$Time))-hms("12:04:07")) 
P1$Time<-period_to_seconds(hms(as.character(P1$Time))) 

をしかし、今それらを一緒にプロットすることは難しいです。私はggplot2を試しましたが、私は2つの垂直軸を得ることができません。任意の考え

ggplot() + 
    geom_line(data = P1IAQ, aes(x = Time, y = Temp, color = "red")) + 
    geom_line(data = P1, aes(x = Time, y = Temp, color = "blue")) + 
    xlab('Time (s)') + 
    ylab('Temperature ºC') 

enter image description here

+2

あなたはそこだという意味ではない:その方法は、あなたがそれらを別の場所にあることに対処しなくても、同じパネル上の両方のラインを持つことができます真の時間からの一定のオフセット?もしそうなら、オフセットは何ですか? – eipi10

+0

@ eipi10 12:04:07から0:0:0までの環境監視時間の開始時刻を皮膚温度の時間と一致させるように移動したいと思います。 (またはその逆)。 – HCAI

+0

「P1のタイムスタンプが間違っています」というステートメントの意味を明確にしてください。ありがとう。 – lrnzcig

答えて

1

各データフレームの時間を共通のスケールにする必要がある場合は、両方を開始から経過した秒数に変換できます日付や時間のクラスについて心配する必要はありません。次に、共通の時間スケールに基づいて2つのデータフレームを結合することができます。

P1IAQデータサンプルを使用して、偽のP1データを作成しました。 P1Timeは、おそらく実際のデータと同じ形式ではありません。 P1のサンプルを投稿した場合、実際のデータに合わせて以下の例を調整することができます。実験の開始からの経過秒数に等しい数値に

library(dplyr) 
library(reshape2) 
library(hms) 
library(zoo) 
library(ggplot2) 
theme_set(theme_light()) 

# Fake P1 data frame 
set.seed(10) 
n=32*60*3 + 1 
P1 = data.frame(Time=as.POSIXct(seq(0,180,length.out=n), origin=as.Date("2016-05-01"), tz="GMT"), 
       SkinTemp = round(cumsum(rnorm(n, 0, 0.01)) + 27.78, 2), 
       RespirationRate=round(rnorm(n, 10, 0.5))) 

変換P1$TimeP1IAQ$Time。 (投稿したデータのP1IAQ$Timefactorであるため、処理する前に文字に変換しました。):長い形式に広いからデータを変換した後

P1j = full_join(P1, P1IAQ, by="nTime", suffix=c("_P1","_P1IAQ")) %>% 
    # Make sure joined data frame is sorted by nTime 
    arrange(nTime) %>% 
    # Fill missing values with Last One Carried Forward 
    mutate_at(vars(Time_P1IAQ, RH, Temp, CO2), na.locf) 

プロット:

P1$nTime = as.numeric(as.hms(P1$Time)) 

P1IAQ$nTime = as.numeric(as.hms(as.character(P1IAQ$Time))) 
P1IAQ$nTime = P1IAQ$nTime - min(P1IAQ$nTime) 

nTimeによってP1P1IAQに参加し

ggplot(P1j %>% select(Time_P1IAQ, nTime, Skin=SkinTemp, Ambient=Temp) %>% 
     # Convert from wide to long format for plotting 
     melt(id.var=c("Time_P1IAQ", "nTime")), 
     aes(nTime, value, group=Time_P1IAQ)) + 
    geom_line() + 
    facet_grid(variable ~ ., scales="free_y") + 
    scale_y_continuous(expand=c(0.5,0)) + 
    labs(x="Elapsed Time (sec)", y=expression(Temperature~"("*degree*C*")")) 

enter image description here

別のオプションは、プロットすることです温度差実験開始時と比較してあなたはタイムスタンプ `P1`が間違っていると言うとき、

ggplot(P1j %>% select(Time_P1IAQ, nTime, Skin=SkinTemp, Ambient=Temp) %>% 
     # Convert from wide to long format for plotting 
     melt(id.var=c("Time_P1IAQ", "nTime")) %>% 
     # Convert temperatures to difference from starting values 
     group_by(variable) %>% 
     mutate(value = value - value[nTime==min(nTime)]), 
     aes(nTime, value, colour=variable)) + 
    geom_line() + 
    labs(x="Elapsed Time (sec)", y=expression(Temperature~Change~"("*degree*C*")"), 
     colour="") 

enter image description here

+0

これは素晴らしいです、ありがとうございます!環境温度の変化が皮膚の温度に影響する前に、時間経過が何であるかを知る方法があるかどうかは疑問です。あなたはそれをグラフから視覚的に行うのが最善だと思いますか?それとも数値的に?しかし、私は信号処理が正しい方法であるかどうかはわかりません... – HCAI

+0

私はすべての変数を最初のグラフのフォーマットでプロットしました。あなたはy軸のタイトルをすべて違うものにする方法を知っていますか?例えば。温度、CO2(ppm)など – HCAI

+1

あなたの最初の質問では、統計的アドバイスのためのQ&Aサイトである[CrossValidated](http://stats.stackexchange.com/)に関する質問をすることをお勧めします。あなたが考慮しなければならないことの1つは、測定値の間に平坦であると仮定するのではなく、「P1IAQ」値を補間することが意味を成すかどうかということです。測定値間で値が単調に変化すると信じる理由がある場合、補間は良い選択肢のようです。 – eipi10

1

私はあなたのデータを持っていないが、私は似たような準備をします...この場合、P1の長さはP1IAQとdiferentです:

library(ggplot2) 
#I create a sample of your data 
P1<-data.frame(1:10,51:60) 
P1IAQ<-data.frame(1:8,1:8) 
colnames(P1)<-c("Time","Temp") 
colnames(P1IAQ)<-c("Time","Temp") 

# I cathegory your data for plot 
df = data.frame(Time=c(P1$Time,P1IAQ$Time), values=c(P1$Temp,P1IAQ$Temp),type=c(rep("P1",length(P1$Time)),rep("P1IAQ",length(P1IAQ$Time)))) 

ggplot(data=df, aes(x=Time, y=values, color=type)) + 
    geom_line() + 
    facet_grid(type ~ ., scales="free") + 
    xlab('Time (s)') + 
    ylab('Temperature ºC') 

enter image description here

+0

ありがとうございます。 P1IAQ $ TempとP1 $ Tempという私のコラムが非常に異なる長さであることが際立っています... – HCAI

+0

あなたのrequerimentsと新しい更新! – derive111

関連する問題