从SAS到R的过程NLIN

从SAS到R的过程NLIN,r,sas,proc,nls,nonlinear-functions,R,Sas,Proc,Nls,Nonlinear Functions,我目前被分配了一项工作,我需要将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);

我目前被分配了一项工作,我需要将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;
样本数据如下:

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
当我浏览SAS帮助中有关PROC NLIN的页面时,参数“MODEL”用于指定公式,但这里的代码没有模型公式。Model.like是指定似然函数(第4316页-),那么这段代码在做什么?我完全糊涂了。一、 最初我觉得这可以在R中使用nls()完成,我尝试了以下方法-

fit = nls(E~ f - R*(1-eta*M),sample, start=list(eta=0,phi=10.86)
      ,trace=T)
但我很快意识到这是错误的,因为即使经过5000次迭代,模型也没有收敛。这是因为,我的数据集中没有列“E”。那么,SAS是如何做到的?
感谢您的帮助

首先,让我们看看SAS代码在做什么
PROC NLIN
可能会被诱骗去做各种最小化问题,但设置有时会违反直觉。您需要定义一个因变量($y$)和一个基于其他变量和一些参数($f(x,beta$)的预测值,它将最小化$\sum\u i[y\u i-f(x\u i,beta)]^2$

定义$y$和$f$的关键是

model.like = sqrt(E*E)
这相当于

model like = sqrt(E*E)
因此,这意味着$\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)
请注意,SAS代码是按名称运行的,因此您必须确保R代码也适用于每个名称的不同型号。

library(tidyverse)
library(broom)

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)


x <- sample %>%
  group_by(Name) %>%
  nest() %>%
  mutate(
    model = data %>% map(~nls(0 ~ f - R*(1-eta*M), data= . , start=list(eta=0,f=10.86), trace=T)),
    coef = map(model, tidy),
    quali = map(model, glance),
    resid = map(model, augment)
  )

unnest(select(x, coef))
# A tibble: 2 x 6
    Name  term  estimate std.error statistic      p.value
  <fctr> <chr>     <dbl>     <dbl>     <dbl>        <dbl>
1   Anna   eta 1.7259120 0.2260999 7.6334045 3.213398e-05
2   Anna     f 0.2731282 0.4645288 0.5879683 5.710103e-01

unnest(select(x, quali))
# A tibble: 1 x 8
       sigma isConv       finTol   logLik       AIC       BIC   deviance df.residual
       <dbl>  <lgl>        <dbl>    <dbl>     <dbl>     <dbl>      <dbl>       <int>
1 0.08348998   TRUE 4.345363e-07 12.80868 -19.61736 -18.42368 0.06273518           9
库(tidyverse)
图书馆(扫帚)
样本百分比
嵌套()%>%
变异(
模型=数据%>%map(~nls(0~f-R*(1-eta*M),数据=,开始=列表(eta=0,f=10.86),跟踪=T)),
coef=地图(模型,整齐),
质量=地图(模型、一览表),
剩余=映射(模型,增强)
)
unnest(选择(x,coef))
#一个tibble:2x6
名称术语估计标准误差统计p值
1安娜埃塔1.7259120 0.2260999 7.6334045 3.213398e-05
2安娜f 0.2731282 0.4645288 0.5879683 5.710103e-01
unnest(选择(x,quali))
#一个tibble:1 x 8
sigma isConv finTol logLik AIC BIC偏差df.残差
1 0.08348998真4.345363e-07 12.80868-19.61736-18.42368 0.06273518 9

非常感谢!这正是我想要理解的!谢谢Italo!我可以问一下如何将不同的起始参数传递给每个组(在这种情况下,传递给每个名称)?
library(tidyverse)
library(broom)

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)


x <- sample %>%
  group_by(Name) %>%
  nest() %>%
  mutate(
    model = data %>% map(~nls(0 ~ f - R*(1-eta*M), data= . , start=list(eta=0,f=10.86), trace=T)),
    coef = map(model, tidy),
    quali = map(model, glance),
    resid = map(model, augment)
  )

unnest(select(x, coef))
# A tibble: 2 x 6
    Name  term  estimate std.error statistic      p.value
  <fctr> <chr>     <dbl>     <dbl>     <dbl>        <dbl>
1   Anna   eta 1.7259120 0.2260999 7.6334045 3.213398e-05
2   Anna     f 0.2731282 0.4645288 0.5879683 5.710103e-01

unnest(select(x, quali))
# A tibble: 1 x 8
       sigma isConv       finTol   logLik       AIC       BIC   deviance df.residual
       <dbl>  <lgl>        <dbl>    <dbl>     <dbl>     <dbl>      <dbl>       <int>
1 0.08348998   TRUE 4.345363e-07 12.80868 -19.61736 -18.42368 0.06273518           9