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 中有不同的平滑方法,例如 loess
和 smooth.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) 时以某种方式调整了误差。但我很合身。
x = c(0:10)
y = c(0, 1, 4, 9, 15, 26, 36.6, 50, 65, 81, 104)
plot(y ~ x)
假设我有一个非常简单的数据集,只有 10 个点。我正在尝试为描述此数据集的模型提出一个数学方程式。 R 中有不同的平滑方法,例如 loess
和 smooth.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) 时以某种方式调整了误差。但我很合身。