我想估计一个非线性模型的参数。
模型方程为Z = A * exp(- a * X) + B * exp(- b * Y) + C
我所做的是在进行线性回归之前,通过指数变换将模型转化为线性问题:
a和b,我计算exp_x = exp(- a * X)和exp_y = exp(- b * Y)Z ~ exp_x + exp_y正如我们在这个模拟中所看到的,它工作得很好。
x = 1:10
y = 1:10
combination = expand.grid(x = x, y = y)
df = data.frame(
X = combination$x,
Y = combination$y,
Z = 2 * exp(-0.3 * combination$x) +
5 * exp(-0.6 * combination$y) +
rnorm(n = 100, mean = 0, sd = 0.1 )
)
a_hat = 0
b_hat = 0
best_ols = NULL
best_rsquared = 0
for (a in seq(0.01, 1, 0.01)){
for (b in seq(0.01, 1, 0.01)){
df$exp_x = exp(- a * df$X)
df$exp_y = exp(- b *df$Y)
ols = lm(data = df, formula = Z ~ exp_x + exp_y)
r_squared = summary(ols)$r.squared
if (r_squared > best_rsquared){
best_rsquared = r_squared
a_hat = a
b_hat = b
best_ols = ols
}
}
}
a_hat
b_hat
best_ols
best_rsquared
> a_hat
[1] 0.34
> b_hat
[1] 0.63
> best_ols
Call:
lm(formula = Z ~ exp_x + exp_y, data = df)
Coefficients:
(Intercept) exp_x exp_y
0.0686 2.0550 5.1189
> best_rsquared
[1] 0.9898669问题:这是缓慢的
它大约需要10秒钟,我需要在其他数据帧上做数千次。
我怎么能大大加快速度呢?
发布于 2016-01-21 00:50:49
也许可以使用nls代替。由于您没有set.seed(),所以无法看出我们的预测是否会类似,但至少在编辑之后我得到了a和b的估计值:
nmod <- nls( Z ~ A*exp(-a*X)+B*exp(-b*Y), data=df, start=list(A=0.5, B=0.5, a=.1,b=.1))
> coef(nmod)
A B a b
2.0005670 4.9541553 0.2951589 0.5937909
#--------
> nmod
Nonlinear regression model
model: Z ~ A * exp(-a * X) + B * exp(-b * Y)
data: df
A B a b
2.0006 4.9542 0.2952 0.5938
residual sum-of-squares: 0.9114
Number of iterations to convergence: 9
Achieved convergence tolerance: 5.394e-06比你10秒钟的经验要快得多。这是在一台有8年历史的机器上。
> system.time( nmod <- nls( Z ~ A*exp(-a*X)+B*exp(-b*Y), data=df, start=list(A=0.5, B=0.5, a=.1,b=.1)) )
user system elapsed
0.036 0.002 0.033 https://stackoverflow.com/questions/34913275
复制相似问题