我有以下x-y对:
x <- seq(.3, .7, by=0.01)
y <- .5 * (x**-2.5) + runif(n = 41, min = -0.25, max = 0.25)
我想找到形状为y-hat = A *(x ** B)的曲线的参数A和B,使得y和y-hat之间的平方误差之和最小化。
此外,曲线必须通过坐标(0.7,1.0)。因此,我真的只需要解决A,因为B = -log(A)/log(0.7)
。
我可以在Excel中使用Solver轻松完成此操作,但编写我自己的算法来解决R中的A超出了我目前的能力。我猜测无论如何已经存在内置解决方案。我查看了poweRlaw包,但似乎没有办法强制曲线通过指定点。
答案 0 :(得分:2)
set.seed(101)
x <- seq(.3, .7, by=0.01)
y <- .5 * (x**-2.5) + runif(n = 41, min = -0.25, max = 0.25)
您需要一个合理的起点:您可以通过log-log回归得到一个。
m1 <- lm(log(y)~log(x)) ## hope all your data are positive
A_est <- exp(coef(m1)[1])
现在您已准备好估算:
n1 <- nls(y ~ A*x^(-log(A)/log(0.7)),start=list(A=A_est))
A <- coef(n1)
B <- -log(A)/log(0.7)
plot(x,y)
curve(A*x^B,add=TRUE,col="red")