拟合通过 r 中指定坐标的幂曲线

Fit power curve that goes through specified coordinates in r

我有以下 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 包,但似乎没有办法强制曲线通过指定点。

set.seed(101)
x <- seq(.3, .7, by=0.01)
y <- .5 * (x**-2.5) + runif(n = 41, min = -0.25, max = 0.25)

你需要一个合理的起点:你可以通过对数-对数回归得到一个。

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")