更快替代eval(解析(text = ...)将字符串转换为R中的变量

时间:2017-02-06 03:27:24

标签: r eval dynamically-generated

我不熟悉R.我已经阅读了其他eval()帖子,但没有一个解决我的情况。我有一个动态创建变量的函数,并使用nlsLM包中的minpack.lm进行优化。它有效,但速度很慢(这需要100K迭代才能永远)。我需要动态地能够在我的函数中创建用于优化的变量,因为设计矩阵X中的协变量的数量可以改变。所以我使用eval(parse(text=...)和其他动态代码来解决。但是,使用Rprof()显示eval(parse(text=...)占用了大部分处理时间。什么是比eval(parse(text=...)更快的替代方案,可以让我动态创建变量并在nlsLM中工作?我已经包含了一个最简单的可重复的例子和一个非常简单的线性回归模型来说明(不是我真正的非线性模型)。

library(minpack.lm)
y<-c(-4.3, -4.3, -3.59, -2.75, -2.247,-2.227, -1.806, -0.536,  0.0275,0.20296,-0.274,-0.00772, 0.19189,-0.95812,-1.3587,-1.78749,-2.36696,-2.15504,-3.164070458,-3.830112052)
Cov1<-c(0,0,3.546704,5.263044,4.842031,3.180945,5.211059,4.774104, 2.696334,3.901650,3.641349,2.676252,4.338524,1.026670,0,0,0,0,0,0)
Cov2<-c(0,0,0,0,0,0,0,3.546704,5.263044,4.842031,3.180945,5.211059,4.774104, 2.696334,3.901650,3.641349,2.676252,4.338524,1.026670,0)
X<-cbind(INT=1,Cov1=Cov1,Cov2=Cov2)
nvar=NCOL(X)
p<-"c(b0"; for (i in 1:(nvar-1)) p=paste0(p,",b",i); p=paste0(p,")")
varnames<-c(paste0("b",0:(nvar-1)))
init<-structure(rep(0,nvar), .Names = varnames)
lb<-structure(c(rep(-Inf,nvar)), .Names = varnames)
ub<-structure(c(rep(Inf,nvar)), .Names = varnames)
parms <- nlsLM(y~X%*%eval(parse(text=p)),start=init, lower=lb,upper=ub)

0 个答案:

没有答案