Proc Nlin程序针对每个日期运行

时间:2015-02-27 15:44:10

标签: sas regression proc

我是SAS的新手,但据我所知,我需要运行Proc Nlin程序来估计曲线拟合。我有大约100天的时间序列数据,所以这意味着我将需要提供包含100组参数的输出。 我在Excel中输入的数据是:

     Date\Years 0,25    0,5 0,75    1   2   3   4   5   6   7   10
04/01/10    1,24    1,39    1,4865  1,583   2,319   2,373   2,948   2,964   3,342   3,287   3,642
05/01/10    1,26    1,39    1,4885  1,587   2,319   2,377   2,941   2,966   3,351   3,286   3,64
06/01/10    1,26    1,39    1,4895  1,589   2,318   2,376   2,945   2,974   3,32    3,276   3,635
07/01/10    1,25    1,39    1,49    1,59    2,332   2,376   2,955   2,976   3,349   3,369   3,641
08/01/10    1,25    1,39    1,4945  1,599   2,347   2,384   2,969   2,984   3,352   3,338   3,64
11/01/10    1,28    1,41    1,501   1,592   2,345   2,391   2,975   2,982   3,353   3,348   3,645
12/01/10    1,29    1,41    1,5055  1,601   2,336   2,389   2,991   2,981   3,396   3,354   3,643
13/01/10    1,31    1,43    1,5285  1,627   2,45    2,568   3,038   3,003   3,422   3,42    3,712
14/01/10    1,28    1,43    1,5265  1,623   2,424   2,558   3,04    2,998   3,384   3,287   3,686
15/01/10    1,28    1,42    1,5195  1,619   2,423   2,423   3,012   2,994   3,383   3,277   3,678
18/01/10    1,27    1,42    1,5195  1,619   2,424   2,597   3,012   2,991   3,359   3,386   3,666
19/01/10    1,29    1,44    1,5305  1,621   2,42    2,596   3,017   2,998   3,192   3,387   3,675

要运行的模型:

proc nlin data=_3 method=newton;
  parms a1 = 0.05 a2 = 0.05
  a3 = 0.05 beta = 1;
   model yield=a1+(a2+a3)*(beta/years)*(1-exp(-years/beta))-a3*exp(-years/beta);

因此,这个模型可以很好地适应数据一天,但是如何让我的样本中的每个日期运行并将参数存储在输出中?

感谢。

1 个答案:

答案 0 :(得分:0)

proc nlin支持SAS'标准by group processing,这意味着您可以请求对变量中的每组值执行单独的分析(假设数据按该变量排序)。

为此,首先要确保数据正确排序:

proc sort data = _3;
    by date;
run;

然后使用by语句通过组处理请求:

proc nlin data=_3 method=newton;
    by date;
    ...
run;

可以找到更多详细信息here


编辑:回答评论中的进一步问题。

为了实现您的目标,您需要构建数据,以便程序可以理解它。数据需要在每行中包含一个日期,期限和费率。下面的代码以您提供的形式获取一些示例数据并对其进行转置。然后,您的代码将与by语句一起使用。

/* Create some dummy data for this example */
data have;
    input date ddmmyy8. y0_25 y0_5 y0_75 y1 y2 y3 y4 y5 y6 y7 y10;
    format date yymmdd10.;
    datalines;
04/01/10 1.24 1.39 1.4865 1.583 2.319 2.373 2.948 2.964 3.342 3.287 3.642
05/01/10 1.26 1.39 1.4885 1.587 2.319 2.377 2.941 2.966 3.351 3.286 3.640
06/01/10 1.26 1.39 1.4895 1.589 2.318 2.376 2.945 2.974 3.320 3.276 3.635
;
run;

/* Transpose data so we have one row for each date/term/rate */
proc transpose data = have out = trans;
    by date;
    var y:;
run;
/* Get the term value from the column names */
data trans;
    set trans;
    years = input(compress(tranwrd(_NAME_, "_", "."), "y"), best.);
    rename COL1 = yield;
    drop _:;
run;

/* Use by group processing, store estimates, plot the line */
proc nlin data = trans method = newton outest = want plots = fit noitprint;
    by date;
    parms a1 = 0.05 a2 = 0.05 a3 = 0.05 beta = 1;
    model yield = a1 + (a2 + a3) * (beta / years) * (1 - exp(-years / beta)) - a3 * exp(-years / beta);
run;

有几点想法:

  • 看起来您的费率来自两个不同来源(对于奇数和偶数条款,请查看图表),我会确认您从源头获取所需内容
  • 请记住在拟合数据中包含较长的术语,而不是在需要更长的时间范围时进行外推