R:一种获得适合数据的模型表达式的方法

R: a way to obtain the expression of a model that is fit to the data

x = c(0:10)
y = c(0, 1, 4, 9, 15, 26, 36.6, 50, 65, 81, 104)
plot(y ~ x)

假设我有一个非常简单的数据集,只有 10 个点。我正在尝试为描述此数据集的模型提出一个数学方程式。 R 中有不同的平滑方法,例如 loesssmooth.spline 等,它们可以很好地将曲线拟合到数据。我的问题是,R 中是否有办法获得适合的公式? IE。对于这个玩具数据集,很明显 y = x^2 是这个数据集的一个很好的选择。

对于比较复杂的数据集,有没有办法得到拟合数据的黄土曲线的数学表达式?

看起来你有一个我们可以用这种幂函数建模的分布:y = a * b^(x)。假设非线性回归不存在,我们可以用"linear regression"来解决这个问题,大概是用到了最小二乘法。我们只需要通过计算等式两边的对数来变换坐标轴。同样,我们只是不知道 "a" & "b"。

ln(y) = ln[a * b^(x)] # 我使用的是自然对数(以 e 为底)。

ln(y) = ln(a) + ln(b^x)

ln(y) = [ln(b)]*(x) + ln(a) <------> Y = m(X) + B, 其中 m = 斜率,B = 垂直截距。我使用了大写字母 B,这样我们就不会混淆了。

现在你觉得这像是一个线性方程吗? 所以现在我们将 y 轴转换为 loge(y),得到线性回归统计数据,在我们的对数底上增加 "m" 和 "B",即e.

所以 e^[ln(b)] 给我们 "b",并且 ...

e^[ln(a] 给我们一个,

然后我们知道 y = a * b^(x) 的数值。

让我们计算一下。我要消除 "x" 和 "y" 中的 0。我们会损失一些精度,但如您所知,ln(0) = -infinity。我们不能这样。

x <- 1:10

y <- c(1, 4, 9, 15, 26, 36.6, 50, 65, 81, 104)

现在最好检查 "x" 和 "y" 中的奇异变量数量是否相同,否则我们无法绘制点。

length(x) == length(y) 1 TRUE

"x" 有 10 个词,"y" 也有 10 个词。

plot(y ~ x) # Let's see what the graph looks like. You already know.

现在改造了吗?

plot(log(y) ~ x))

嗯,变形后看起来不像直线

因此,它不是幂函数。我错了。同样,这个日志是基于 e 的。

让我们试试双对数图。

plot(log(y) ~ log(x), main = "Double logarithmic plot to test for an exponential function", pch = 16, cex.main = 0.8)

这是一条直线,所以我们畅通无阻。我对配电的看法是错误的。这个指数函数适合这样的情况......

y = a * x^(b), 计算等式两边的对数,得到

ln(y) = b[ln(x)] + ln(a)

那么:e^[ln(a)],其中 ln(a) 是垂直截距,= "a"

那么:b[ln(x)] 或对数调整斜率。我们已经有了"e",不用调整了。

model <- lm(log(y) ~ log(x))

abline(model)

summary(model)

致电: lm(公式 = log(y) ~ log(x))

残差: 最小值 1Q 中值 3Q 最大值 -0.069478 -0.000490 0.005266 0.012249 0.031271

系数: 估计标准。误差t值Pr(>|t|)
(截距)-0.01376 0.02212 -0.622 0.551

log(x) 2.01349 0.01330 151.360 4.06e-15 ***

签名。代码:0‘’0.001‘’0.01‘’0.05‘.’0.1‘’1

残差标准误差:8 个自由度上的 0.02925 多重 R 平方:0.9997,调整 R 平方:0.9996 F 统计量:1 和 8 DF 上的 2.291e+04,p 值:4.06e-15

那么在我们的 y = a * x^(b) 函数中,为了得到 "a",我们计算 ...

exp(-0.01376) 1 0.9863342

plot(y ~ x, main = "Nonlinear Regression: y = 0.9863342 * x^(2.01349)", cex.main = 0.8)

现在,在您自己拟合曲线之前,请不要只相信我。

curve(0.9863342 * x^(2.01349), col = "darkorchid3", add = TRUE)

所以我们终于计算出...

y = a * x^(b) <------------> y = 0.9863342 * x^(2.01349), 所以 a = 0.9863342,b = 2.01349

从技术上讲,我没有进行非线性回归,也没有进行迭代猜测。 为了给你一个统计上正确的答案,我必须告诉你,最小二乘线性回归有一些标准误差,并且在我计算 e^(-0.01376) 时以某种方式调整了误差。但我很合身。