Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从SAS到R的PROC NLIN

从SAS到R的PROC NLIN
EN

Stack Overflow用户
提问于 2014-09-10 02:27:52
回答 2查看 2.2K关注 0票数 3

目前,我被分配了一项工作,需要将SAS代码翻译成R。我已经成功地完成了其中80%的工作,现在我被困在使用PROC NLIN的部分。根据我所读到的,PROC NLIN被用来拟合非线性模型,andI不确定代码是否真的在这样做,因此,在R中坚持如何做它,代码如下-

代码语言:javascript
运行
AI代码解释
复制
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;

样本数据如下-

代码语言:javascript
运行
AI代码解释
复制
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页- https://support.sas.com/documentation/cdl/en/statugnlin/61811/PDF/default/statugnlin.pdf),那么这段代码在做什么?我完全糊涂了。我,最初觉得这可以用nls()在R中完成,我尝试了以下方法-

代码语言:javascript
运行
AI代码解释
复制
fit = nls(E~ f - R*(1-eta*M),sample, start=list(eta=0,phi=10.86)
      ,trace=T)

但我很快意识到这是错误的,因为即使经过5000次迭代,模型也没有收敛。这是因为,我的数据集中没有列'E‘。那么,SAS是怎么做到的呢?任何帮助都是非常感谢的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-10 07:31:21

首先,让我们了解一下SAS代码正在做什么。PROC NLIN可以被骗到做各种最小化的问题,但设置有时是违反直觉的。您需要定义一个因变量($y$)和一个基于其他变量和一些参数($f(x,\beta$)的预测值,并且它将最小化$\sum_i y_i - f(x_i,\beta)^2$。

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

代码语言:javascript
运行
AI代码解释
复制
model.like = sqrt(E*E)

这相当于

代码语言:javascript
运行
AI代码解释
复制
model like = sqrt(E*E)

因此,这意味着$\sum类的- \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$,其中fET是未知参数。我不知道这意味着什么,但事情就是这样。

将其重写为R确实可以使用nls,我们也可以使用相同的技巧:预测为零。

代码语言:javascript
运行
AI代码解释
复制
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)

带输出

代码语言:javascript
运行
AI代码解释
复制
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

请注意,SAS代码是运行by Name的,因此您必须确保R代码也适合每个名称的不同模型。

票数 5
EN

Stack Overflow用户

发布于 2017-07-03 15:47:56

潮汐法

代码语言:javascript
运行
AI代码解释
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25763070

复制
相关文章
matlab插值函数的作用,matlab 插值函数[通俗易懂]
MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,’method’)
全栈程序员站长
2022/09/05
1.4K0
matlab fprintf函数_matlab绝对值函数
按指定的格式将变量的值输出到屏幕或指定文件,fid为文件句柄,若缺省,则输出到屏幕
全栈程序员站长
2022/11/02
1K0
matlab fprintf函数_matlab绝对值函数
matlab 稀疏矩阵 乘法,Matlab 矩阵运算[通俗易懂]
说明:这一段时间用Matlab做了LDPC码的性能仿真,过程中涉及了大量的矩阵运算,本文记录了Matlab中矩阵的相关知识,特别的说明了稀疏矩阵和有限域中的矩阵。Matlab的运算是在矩阵意义下进行的,这里所提到的是狭义上的矩阵,即通常意义上的矩阵。
全栈程序员站长
2022/09/12
3.1K0
matlab的fprintf语句_matlab绝对值函数
2、用法说明: fprintf(fid, format, variables); 按指定的格式将变量的值输出到屏幕或指定文件;
全栈程序员站长
2022/11/02
1K0
【MATLAB】数据类型 ( 矩阵 | 随机数函数 | 生成矩阵 )
作用 : 生成 标准正态分布的 伪随机数 ; 标准正态分布指的是均值 0 , 方差 1 ;
韩曙亮
2023/03/29
9240
【MATLAB】数据类型 ( 矩阵 | 随机数函数 | 生成矩阵 )
matlab输出矩阵格式_matlab中uint8函数用法
1、uint8与double double函数只是将读入图像的uint8数据转换为double类型,一般不使用;常用的是im2double函数,将 uint8图像转为double类型,范围为0-1,如果是255的图像,那么255转为1,0还是0,中间的做相应改变。 MATLAB中读入图像的数据类型是uint8,而在矩阵中使用的数据类型是double。因此 I2=im2double(I1) :把图像数组I1转换成double精度类型;如果不转换,在对uint8进行加减时会产生 溢出。默认情况下,matlab将图象中的数据存储为double型,即64位浮点数;matlab还支持无符号整型 (uint8和uint16);uint型的优势在于节省空间,涉及运算时要转换成double型。 im2double():将图象数组转换成double精度类型 im2uint8():将图象数组转换成unit8类型 im2uint16():将图象数组转换成unit16类型 2、uint8和im2uint8 在数据类型转换时候uint8和im2uint8的区别,uint8的操作仅仅是将一个double类型的小数点后面的部 分去掉;但是im2uint8是将输入中所有小于0的数设置为0,而将输入中所有大于1的数值设置为255,再将所 有其他值乘以255。 图像数据在计算前需要转换为double,以保证精度;很多矩阵数据也都是double的。要想显示其,必须先 转换为图像的标准数据格式。如果转换前的数据符合图像数据标准(比如如果是double则要位于0~1之间) ,那么可以直接使用im2uint8。如果转换前的数据分布不合规律,则使用uint8,将其自动切割至0~255( 超过255的按255)。最好使用mat2gray,将一个矩阵转化为灰度图像的数据格式(double) 3、double类型图像的显示 图像数据在进行计算前要转化为double类型的,这样可以保证图像数据运算的精度。很多矩阵的很多矩 阵数据也都是double的,要想显示其,必须先转换为图像的标准数据格式。如果直接运行imshow(I),我们会 发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都 是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被 不正常得显示为白色图像了。具体方法有: imshow(I/256); ———-将图像矩阵转化到0-1之间 imshow(I,[]); ———-自动调整数据的范围以便于显示 (注意这里,必须是灰度图,否 则不行) imshow(uint8(I)); imshow(mat2gray(I)); 上面的mat2gray是将最终获得的矩阵转化为灰度图像。常用的为: A = im2uint8(mat2gray(result)) 这样就将result矩阵转化为uint8类型的图像。
全栈程序员站长
2022/09/30
2.8K0
MATLAB插值函数interp1
插值法又称“内插法”,是利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法。如果这特定函数是多项式,就称它为插值多项式。
全栈程序员站长
2022/07/01
6550
MATLAB插值函数interp1
矩阵组合matlab,matlab中矩阵的所有组合[通俗易懂]
X = perms(1:N); % # Permuations of column indices
全栈程序员站长
2022/08/01
1.4K0
MATLAB 矩阵分块函数 mat2cell 及 cellfun 函数
该文介绍了MATLAB中矩阵分块函数和cellfun函数在项目中的应用。首先介绍了mat2cell函数的用法,该函数可以将矩阵划分成不同的块,并可以指定每个块的维度。然后介绍了cellfun函数的用法,该函数可以对每个块进行相同的操作,例如求和、求均值等。最后通过一个例子说明了如何使用mat2cell和cellfun函数,将一个10*5的矩阵划分成不同的块,并求出每个块的所有元素之和。
Alan Lee
2018/01/02
4.5K0
MATLAB 矩阵分块函数 mat2cell 及 cellfun 函数
【MATLAB】矩阵操作 ( 矩阵构造 | 矩阵运算 )
设置一个已经给定的矩阵的行列重复次数 , 根据给定的矩阵 , 进行指定的重复 , 生成新矩阵 ;
韩曙亮
2023/03/29
1.3K0
【MATLAB】矩阵操作 ( 矩阵构造 | 矩阵运算 )
MATLAB矩阵运算
MATLAB以矩阵作为数据操作的基本单位,这使得矩阵运算变得非常简捷、方便、高效。矩阵是由m×n个数av (i=1,2,…,m; j = 1,2,…,n)排成的m行n列数表,记成:
全栈程序员站长
2022/09/12
1.2K0
MATLAB矩阵运算
matlab矩阵拼接
3 4 3 4]
全栈程序员站长
2022/09/12
1.9K0
MATLAB矩阵生成
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153010.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/12
8290
matlab 矩阵除法
Matlab提供了两种除法运算:左除(/)和右除(/)。 一般情况下,x=a/b是方程a*x =b的解,而x=b/a是方程x*a=b的解。 例:a=[1 2 3; 4 2 6; 7 4 9] b=[4; 1; 2]; x=a/b 则显示:x= -1.5000 2.0000 0.5000 如果a为非奇异矩阵,则a/b和b/a可通过a的逆矩阵与b阵得到: a/b = inv(a)*b b/a = b*inv(a)
全栈程序员站长
2022/09/07
1.6K0
Matlab矩阵大全
(1)将二维矩阵A转化成一维矩阵(列向量):Matlab 默认将其转化成列向量,需要行向量转置即可。
全栈程序员站长
2022/09/12
1.2K0
Matlab矩阵大全
如何在matlab矩阵中随机生成圆【含源代码】
言归正传,巴山在浏览知乎时邀请我回答上图所示的问题,所幸就点进去看了一眼,并给了解题思路。
巴山学长
2021/03/30
2.1K0
如何在matlab矩阵中随机生成圆【含源代码】
字符串矩阵 matlab(matlab 字符串矩阵)
这里字符串矩阵(或者有更标准的名称?)是指一个矩阵中的每个元素为长短不一的字符串,如:
全栈程序员站长
2022/08/01
3.7K0
MATLAB(2)–MATLAB矩阵的表示
利用直接输入法建立矩阵:将矩阵的元素用中括号括起来,按矩阵的顺序输入各元素,同一行的各元素之间用逗号或者空格分隔,不同的元素之间用分号分隔。
全栈程序员站长
2022/09/12
1.2K0
MATLAB(2)–MATLAB矩阵的表示
matlab矩阵求逆矩阵非方阵_matlab验证逆矩阵出问题
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168305.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
7470
matlab矩阵求逆矩阵非方阵_matlab验证逆矩阵出问题
如何在矩阵的行上显示“其他”【2】
这个显示结果虽然达到了基础的目的,但并不是很理想。很明显,我们想的是让others在最后一行:
陈学谦
2021/11/15
1.7K0

相似问题

如何外推旋转矩阵值?

16

外推热矩阵中的封顶值

112

Matlab外推符号翻转

12

Matlab interp2外推

23

如何在Matlab中指定矩阵的子矩阵外?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档