簡體   English   中英

SAS 或 R 中的事件的時間序列圖

[英]Time series graph with events in SAS or R

我有這個示例數據集。

data WORK.EXAMPLE;
  infile datalines delimiter=',' truncover; 
  input test_date date9.  event_text :$100.  date_of_event:date9.  ALLE:$12.;
    format test_date  date_of_event  ddmmyyd8.;
datalines4;
01JAN2020,event1,01JAN2020, method1
01JAN2020,event1,01JAN2020,method1
01JAN2020,event1,01JAN2020,method1
01JAN2020,event1,01JAN2020,method1
01JAN2020,event1,01JAN2020,method2
02JAN2020,event2,02JAN2020,method2
02JAN2020,event2,02JAN2020,method2
02JAN2020,event2,02JAN2020,method2
03JAN2020,.,.,.
03JAN2020,.,.,.
04JAN2020,event3,04JAN2020,method2
04JAN2020,event3,04JAN2020,method2
04JAN2020,event3,04JAN2020,method2
04JAN2020,event3,04JAN2020,method1
04JAN2020,event3,04JAN2020,method1
06JAN2020,.,.,.
06JAN2020,.,.,.
07JAN2020,.,.,.
07JAN2020,.,.,.
08JAN2020,event4,08JAN2020,method1 
08JAN2020,event4,08JAN2020,method1  
08JAN2020,event4,08JAN2020,method1  
09JAN2020,event5, 09JAN2020,method1 
09JAN2020,event5, 09JAN2020,method1 
09JAN2020,event5, 09JAN2020,method1 
09JAN2020,event5, 09JAN2020,method1 
09JAN2020,event5, 09JAN2020,method1 
;;;;

我希望制作以下 plot,其中 CASES 是基於 Y 軸上的 test_date 的實際測試次數。 X 軸應該是基於 dates_of_events 的特定日期。 event_text 應該放在每個事件日期的上方。 還有一條曲線說明了測試次數隨時間的變化。

在 R 中,可以使用ggplot2 package。 有了這個 package,你可以做的事情是無限的。 所以是的。 絕對可以在 R 中構建您的 plot,雖然我不明白您想要什么。 這是我認為您想要的 R(使用 ggplot2)中的代碼示例。

生成數據的代碼:

x <- (101:300)/10

df <- data.frame(
  date = seq.Date(as.Date("2020-01-01"), by = "day", length.out = 200),
  cases = (x^3) - (3*x)
)

df$important_breaks <- cut(
  df$cases,
  breaks = c(1000, 5000, 10000, 20000, 26910),
  labels = c("break1", "break2", "break3", "break4")
)

plot的代碼:

library(ggplot2)

ggplot(df) +
  geom_area(
    aes(x = date, y = cases, fill = important_breaks)
  ) +
  geom_line(
    aes(x = date, y = cases),
    color = "black",
    size = 1
  ) +
  theme(legend.position = "bottom") +
  annotate(
    geom = "text",
    x = as.Date("2020-02-10"),
    y = 17000,
    label = "A very important note\nabout an event",
    family = "serif",
    size = 13/.pt
  ) + 
  geom_curve(
    aes(x = as.Date("2020-02-10"), xend = as.Date("2020-02-20"), y = 14000, yend = 1500),
    arrow = arrow(length = unit(0.03, "npc"))
  )

這只是一個模板,您可能想要更改 colors,添加更多注釋,因此您可能需要調整很多我的代碼,但是可以使用ggplot2 ZEFE90A8E604A7C640E88D03A78 做您想做的事情我強烈建議訪問R 圖形廚房,看看ggplot2和 R 在圖形方面有多強大的適當示例。

Plot 生成: 在此處輸入圖像描述

當您有很多日期時,標記數據點變得不可讀。 你最終可能想要一個堆疊的 vbar 或某種漸變或 plot

SAS

從舊金山 covid 測試數據構建的“大”數據的示例圖。 該結構模仿了我認為您的示例數據的內容。

%if not %sysfunc(exist(work.sfcovid,data)) %then %do;
  filename sfcsv temp;

  proc http 
    url='https://data.sfgov.org/api/views/nfpa-mg4g/rows.csv?accessType=DOWNLOAD'
    out=sfcsv;

  proc import out=sfcovidtesting datafile=sfcsv dbms=csv;
  run;
%end;


data sftests(label='real sf covid data slightly mangled for hans question');
  call streaminit(30122020);

  set sfcovidtesting;

  test_date = specimen_collection_date;

  * make 85% of the data not missing;
  if rand('uniform') < 0.85 then do;
    id+1;
    length event_text $10;
    event_text = cats('event_',id);
    event_date = test_date;
  end;
  else do;
    call missing (event_text, event_date);
  end;

  methods = rand('integer',3);
  do _n_ = 1 to tests;
    length method $10;
    if event_date then 
      method = scan('antigen antibody molecular', rand('integer',methods));

    output;
  end; 

  format test_date event_date date9.;

  keep test_date event_text event_date method;
run;

* pre plot summarization for series and needle;

proc sql;
  create table counts as select
  test_date, count(event_date) as count
  from sftests
  group by test_date;

  create table methods as 
  select distinct test_date, method 
  from sftests
  ;

data method_lists(keep=test_date methods);
  do until (last.test_date);
    set methods;
    by test_date;

    length methods $35;
    methods = catx('*',methods,method);
  end;
run;

data forplot;
  merge counts method_lists;
  by test_date;
  if count=0 then call missing(count);
run;



ods html file='plot.html';
proc sgplot data=forplot;
  title 'SERIES plot from presummarized data';
  series x=test_date y=count / break;
run;

proc sgplot data=forplot;
  title 'SERIES plot from presummarized data';
  series x=test_date y=count / break datalabel=methods splitchar='*';
  where test_date between '01mar2020'd and '01apr2020'd-1;
run;

proc sgplot data=forplot;
  title 'NEEDLE plot from presummarized data';
  needle x=test_date y=count / datalabel=methods splitchar='*';
  where test_date between '01mar2020'd and '01apr2020'd-1;
run;

proc sgplot data=sftests;
  title 'VBAR plot from raw data';
  
  vbar test_date / group=method;
  where test_date between '01mar2020'd and '01apr2020'd-1;
run;
ods html close;

樣本 SGPLOT 輸出

在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述 在此處輸入圖像描述

您還可以執行 SGPLOT plot ,其中點或針顏色對應於alle中找到的方法的混合(甚至加權混合)。

您所描述的是基本行 plot; 但是,根據細節,您可能需要一些額外的工作。

這是基本的 plot:

proc sgplot data=example;
  vline date_of_event/group=alle datalabel=event_text;
  xaxis type=time;
run;

group有兩行, datalabel分配事件文本標簽, xaxis使它顯示介於最低和最高之間的所有日期(或者您可以告訴它要使用的范圍)。

但是,這可能無法處理您想要的零結果。 break選項有時會為您解決此問題,但我認為這里不會。 相反,您可能需要先對數據進行預匯總。

你可以使用這樣的東西:

proc means data=example nway completetypes ;
  class date_of_event alle;
  output out=example_Sum n=;
run;

proc sgplot data=example_Sum;
  vline date_of_event/group=alle response=_FREQ_  ;
  xaxis type=time;
run;

不過,您必須重新合並event_text ,因為這不適用於completetypes 您還需要更新數據集以使date_of_event在每一行中至少出現一次 - 如果它完全丟失,這實際上不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM