【发布时间】:2017-04-25 08:39:48
【问题描述】:
我有实验数据点,我想与我的模型相匹配,该模型有 3 个参数(p、q 和 R)。因此,我有三个嵌套的 for 循环来遍历三个参数的所有可能组合,然后确定最佳拟合(残差的最小二乘)。我就是这样做的(权重 = 1/exp(y)):
tgreparpq <- function(x, p, q, R){exp(-(p + q)*x)*(1 + x*(q + R*p) + x^2*((R*q^2)/2 + R*q*p) + x^3*R^2*q^2*p/2)}
pvalues <- seq(1e-10,1.01,0.01)
qvalues <- seq(1e-10,1.01,0.01)
repair <- seq(1e-10,1.01,0.01)
bestl <- array(dim = c(length(pvalues), length(qvalues)))
sigmapq <- array(dim = c(length(pvalues), length(qvalues)))
bestp <- vector(length = klength)
bestq <- vector(length = klength)
bestr <- array(dim = c(length(pvalues), length(qvalues)))
bestrk <- vector(length = klength)
#number of dose rates = klength
klength = 2
for (k in 1:klength){
x <- c(0, dat$Dose[dat$Rate%in%rle(dat$Rate)$values[k]])
SR <- vector(length = length(repair))
for (i in 1:length(pvalues)){
for (j in 1:length(qvalues)){
for (l in 1:length(repair)){
y <- tgreparpq(x,pvalues[i], qvalues[j], repair[l])
SR[l] <- sum(((y-c(1,dat$Survival[dat$Rate%in%rle(dat$Rate)$values[k]]))*1/exp(y))^2)
}
bestl[i,j] <- which(SR %in% min(SR))
sigmapq[i,j] <- SR[bestl[i,j]]
bestr[i,j] <- repair[bestl[i,j]]
}
}
besti <- which(sigmapq == min(sigmapq), arr.ind = TRUE)[1]
bestp[k] <- pvalues[besti]
bestj <- which(sigmapq == min(sigmapq), arr.ind = TRUE)[2]
bestq[k] <- qvalues[bestj]
bestrk[k] <- bestr[besti,bestj]
}
这是一个相当缓慢的过程,我知道您不应该在 r 中使用那么多 for 循环。因此我的问题是:有没有更好的方法来确定合适的参数(即有没有办法替换 for 循环)?
编辑: 以下是一些示例数据:
dat =
Dose Survival Rate
1.9163E+00 6.42870E-01 3.0000E+01
3.9713E+00 3.68150E-01 3.0000E+01
5.9857E+00 1.76050E-01 3.0000E+01
7.9572E+00 8.27670E-02 3.0000E+01
1.0013E+01 2.01370E-02 3.0000E+01
1.2015E+01 1.09200E-02 3.0000E+01
1.9683E+00 6.42530E-01 7.6800E+01
2.9740E+00 4.86220E-01 7.6800E+01
4.0354E+00 3.09730E-01 7.6800E+01
5.0276E+00 2.13930E-01 7.6800E+01
6.0851E+00 1.67200E-01 7.6800E+01
7.0223E+00 1.04640E-01 7.6800E+01
8.0531E+00 6.79020E-02 7.6800E+01
9.0841E+00 3.14080E-02 7.6800E+01
1.0135E+01 2.12510E-02 7.6800E+01
1.1176E+01 8.39810E-03 7.6800E+01
1.2168E+01 4.92070E-03 7.6800E+01
1.4169E+01 1.53690E-03 7.6800E+01
【问题讨论】:
-
请提供reproducible example。当没有
dat提供给测试时,显示你的整个代码是没有意义的。 -
tgreparpq的功能是什么? -
我添加了它。这是一个将生存描述为剂量函数的函数(使用三个参数)。
-
所以您实际上是在对代码进行非线性拟合并扫描所有可能的参数值以最小化 MSE?我得到正确了吗?你可以检查这个stat.ethz.ch/R-manual/R-devel/library/stats/html/nls.html。也许它可以帮助你......
-
什么是
klength?
标签: r performance for-loop