【问题标题】:Plot Two Regression Lines on Same Scatter Plot By Year: X-Axis Date MM/DD按年份在同一散点图上绘制两条回归线:X 轴日期 MM/DD
【发布时间】:2021-12-14 03:53:40
【问题描述】:

我有一个呼叫/时间的散点图。我的 x 变量是日期(日/月),我的 Y 变量是每个日期的调用次数。我想使用 PROC SGPLOT REG 绘制两条回归线,一条用于 2019 年,一条用于 2020 年。但是,当我尝试这样做时,我得到的只是一个没有回归线的常规散点图。这是我的代码:

 proc sgplot data=intern.bothphase1;
 reg x=date y=count / group=Year;
 label count="Calls Per Day" year="Year";
 Title "Comparison of EMS Calls per Day 1/1 - 3/31 in 2019 vs. 
 2020";
 run;

散点图没有问题(2019 年和 2020 年的值以不同的颜色显示),但我想看看两个时间段之间的趋势有何不同,所以我真的想在那里得到回归线。有人可以帮忙吗?

我想这与我用 / 连接我的日期和月份这一事实有关,因此它是一个字符变量,因此 SAS 无法计算回归。我这样做是为了可以使用 year 作为类变量。我的表中仍然有原始日期变量,有没有办法让 SAS 将月/日作为数字变量提供给我?

谢谢!

编辑:我在 SAS 中使用了日期值并将格式更改为 mm/dd,但这无济于事,因为回归线只是在图表的两端而不是重叠(附图片)。 what I want is to have the regression lines overlap for the same time period 2019 vs. 2020 这是因为 SAS 日期对应于 1960 年 1 月 1 日的数字。我想要的是 mm/dd 对应于数字 1-365,所以我得到两条重叠的回归线来显示趋势如何从一年到下一年发生变化。有人知道我该怎么做吗?

【问题讨论】:

  • 你不能用字符变量做回归,所以你就在那里。将其转换为 SAS 日期并对其应用格式。您可以拥有一个包含年份的新变量,甚至可以重组您的数据,以便在不同的列中有不同的年份。
  • 格式为mmddyy5. 的日期值将显示为mm/dd。因此,如有必要,计算一个日期值,并将其用于 x。
  • 大家好,感谢您的帮助,但这不起作用。由于 SAS 中的日期是自 1960 年 1 月 1 日以来的天数,因此更改格式没有帮助。我需要 mm/dd 关联的是数字 1-365,因此回归线重叠。关于我如何做到这一点的任何想法?我会将我的问题的图片附在问题的正文中。

标签: date group-by sas regression sgplot


【解决方案1】:

这里有两个步骤:首先,您需要生成一个 1-365 的“日”值...所以我们只需从日值中减去 01JAN。

data have;
  do date = '01JAN2019'd to '31DEC2020'd;
    count = 25+2*rand('uniform');
    year = year(date);
    if month(date) le 3 then output;
  end;  
  format date date9.;
run;

data adjusted;
  set have;
  date_fixed = date - intnx('year',date,0,'b') + 1;  *current date minus jan 1 plus 1 (otherwise off by 1);
  format date_fixed date5.;                          *this does not actually affect the graph axis, oddly;
run;


 proc sgplot data=adjusted;
 reg x=date_fixed y=count / group=Year;
 xaxis valuesformat=date5.;                   *this seems to be needed for some reason;
 label count="Calls Per Day" year="Year";
 Title "Comparison of EMS Calls per Day 1/1 - 3/31 in 2019 vs. 
 2020";
 run;

然后我们添加xaxis 行,因为由于某种原因它不遵守DATE5. 格式(也可以使用MMDDYY5.,正如Reeza 在 cmets 中指出的那样,但我们可以强制它到这里。

这是我得到的。您可以使用其他轴选项来进一步限制事物,例如 01APR 不会显示。

)

【讨论】:

  • 感谢您的帮助!但是,我在 do 语句上遇到了一些麻烦。它从我原来的 900 个观测值中创建了一百万个观测值。不知道我做错了什么?我最终找到了以下代码来获取我的日期变量: DayOfYear = date - intnx('year', date, 0, 'b') + 1;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2014-08-30
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多