RHe*_*elp 3 r sas nonlinear-functions nls proc
我目前被分配了一项工作,我需要将 SAS 代码翻译成 R。我已经成功完成了 80%,现在我被困在使用 PROC NLIN 的部分。从我读到的,PROC NLIN 用于拟合非线性模型,我不确定代码是否真的这样做,因此,坚持如何在 R 中做到这一点。代码如下 -
proc nlin data=ds1 outest=estout;
parms ET= 0 f= 10.68;
E= f- R*(1-ET*M);
L = E*E;
model.like = sqrt(E*E);
by Name ;
run;
Run Code Online (Sandbox Code Playgroud)
样本数据如下——
Name M R
Anna 0.5456231 4.118197
Anna 0.5359164 4.240243
Anna 0.541881 3.943975
Anna 0.5436047 3.822222
Anna 0.5522962 3.58813
Anna 0.5561487 3.513195
Anna 0.5423374 3.666507
Anna 0.525836 3.715371
Anna 0.5209941 3.805572
Anna 0.5304675 3.750689
Anna 0.5232541 3.788292
Run Code Online (Sandbox Code Playgroud)
当我浏览 SAS 帮助中 PROC NLIN 的页面时,参数“模型”用于指定方程,但此处的代码没有模型方程。Model.like 是指定似然函数(第 4316 页 - https://support.sas.com/documentation/cdl/en/statugnlin/61811/PDF/default/statugnlin.pdf)那么这段代码是做什么的?我完全糊涂了。我最初觉得这可以在 R 中使用 nls() 完成,我尝试了以下操作 -
fit = nls(E~ f - R*(1-eta*M),sample, start=list(eta=0,phi=10.86)
,trace=T)
Run Code Online (Sandbox Code Playgroud)
但我很快意识到这是错误的,因为即使经过 5000 次迭代,模型也没有收敛。这是因为,我的数据集中没有“E”列。那么,SAS 是如何做到的呢?任何帮助表示赞赏!
首先让我们弄清楚SAS代码在做什么。PROC NLIN可以被欺骗来做各种最小化问题,但设置有时是违反直觉的。您需要定义一个因变量 ($y$) 和基于其他变量和一些参数 ($f(x, \beta$) 的预测值,它将最小化 $\sum_i [y_i - f(x_i,\测试版)]^2$。
定义 $y$ 和 $f$ 的关键行是
model.like = sqrt(E*E)
Run Code Online (Sandbox Code Playgroud)
这相当于
model like = sqrt(E*E)
Run Code Online (Sandbox Code Playgroud)
所以这意味着 $\sum [like - \sqrt{E\cdotE}]^2$ 将被最小化。根据您链接的示例,我假设该变量like是之前定义的,并且已设置为常量 0。这意味着 $\sum [0- \sqrt{E\cdotE}]^2 = \sum E^2 $ 正在最小化。
E被定义为f- R*(1-ET*M),所以实际上 $\sum [f-R*(1-ET*M)]^2$ 被最小化,其中f和ET是未知参数。我不确定这是什么意思,但这就是正在发生的事情。
将其重写为 R 确实可以使用nls,我们可以使用相同的技巧:预测零。
sample <- read.table(textConnection(
"Name M R
Anna 0.5456231 4.118197
Anna 0.5359164 4.240243
Anna 0.541881 3.943975
Anna 0.5436047 3.822222
Anna 0.5522962 3.58813
Anna 0.5561487 3.513195
Anna 0.5423374 3.666507
Anna 0.525836 3.715371
Anna 0.5209941 3.805572
Anna 0.5304675 3.750689
Anna 0.5232541 3.788292"), header=TRUE)
nls(0 ~ f - R*(1-eta*M), data=sample, start=list(eta=0,f=10.86), trace=T)
Run Code Online (Sandbox Code Playgroud)
带输出
546.5988 : 0.00 10.86
0.06273518 : 1.7259120 0.2731282
Nonlinear regression model
model: 0 ~ f - R * (1 - eta * M)
data: sample
eta f
1.7259 0.2731
residual sum-of-squares: 0.06274
Number of iterations to convergence: 1
Achieved convergence tolerance: 4.345e-07
Run Code Online (Sandbox Code Playgroud)
请注意,SAS 代码是 run by Name,因此您必须确保 R 代码也适合每个名称的不同模型。