r - Matlabs最小二乘估计通过\用于R中的欠定系统
问题描述
我想找到一个欠定线性方程组的最小二乘估计,就像 Matlab 对“\”所做的那样。
我试图在 R 中重现的内容
% matlab code
X = [3.8642 9.6604;
14.2000 35.5000;
41.7832 104.4580;
0.4084 1.0210];
y = [1.2300
4.5200
13.3000
0.1300];
X\y % => [0, 0.1273]
我尝试了 R 的lsfit
方法,包中的广义逆 ( ginv
) MASS
,并使用 QR 组合 (R^{-1}Q'y),但都返回不同的结果。
解决方案
为了将来参考,正如我在评论中所说,以预期回答者可以轻松使用的格式提供示例输入被认为是一种很好的做法(它可以帮助其他人帮助您!)。在这里,您需要一个 R 解决方案,因此示例输入也应该以一种易于在 R 中使用的方式提供。以下是您可以提供的方式:
x <- matrix(c(3.8642, 14.2, 41.7832, 0.4084, 9.6604, 35.5, 104.458, 1.021),
ncol = 2)
y <- c(1.23, 4.52, 13.3, 0.13)
解决了这部分问题,我们可以继续这个问题:如何\
为最小二乘估计做相当于 MATLAB 的?文档\
说
x = A\B 求解线性方程组 A*x = B。
您正在寻找的 R 中的等价物是solve()
or qr.solve()
,在这种情况下:
?solve
这个通用函数为 x 求解方程 a %*% x = b
。. .
qr.solve 可以处理非正方形系统。
所以,我们可以看到
qr.solve(x, y)
# [1] 0.003661243 0.125859408
这非常接近您的 MATLAB 解决方案。同样,lsfit()
或者lm()
(当然)给你同样的答案:
coef(lm(y ~ x + 0))
# x1 x2
# 0.003661243 0.125859408
lsfit(x, y, intercept = FALSE)$coef
# X1 X2
# 0.003661243 0.125859408
我们可以看到这个答案至少与您的 MATLAB 解决方案一样适合数据:
r_solution <- coef(lm(y ~ x + 0))
y - (x %*% r_solution)
[,1]
[1,] -1.110223e-15
[2,] 1.366296e-06
[3,] -4.867456e-07
[4,] 2.292817e-06
matlab_solution <- c(0, 0.1273)
y - (x %*% matlab_solution)
[,1]
[1,] 0.00023108
[2,] 0.00085000
[3,] 0.00249660
[4,] 0.00002670
推荐阅读
- excel - Excel - 对从另一个工作表中提取的数据进行排序
- twitter-bootstrap - Bootstrap - 使内联表单选择更长的时间
- arrays - 从 Ruby 中的数组中删除重复项并对特定索引执行操作
- python - 在 drop 函数中重复数据框名称
- php - Magento 2 矩阵费率结帐问题(未找到使用这种方法的运营商:matrixrate_5334)
- swift - 覆盖子类中的枚举案例
- c# - 如何在 xamarin 表单中实现后台通知?
- android - 应用程序的 PlayStore URL 显示 App 的 PackageName 或其 ApplicationId?
- arrays - 使用角度 6 获取对象数组的百分比
- typescript - 反应导航:如何在打字稿中使用 NavigationStackScreenComponent 类型传递 redux 道具