我是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);
因此,这个模型可以很好地适应数据一天,但是如何让我的样本中的每个日期运行并将参数存储在输出中?
感谢。
答案 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;
有几点想法: