我有一个代码需要转换为Matlab,如下所示:
xt = c(-0.227, -0.604, 0.974, 2.639, -0.271, -0.355, -0.551, 0.342, 2.390, -1.257)
sets = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
methods = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2)
wt = c( 1, 1, 1, 1, 1, 3, 3, 3, 3, 3)
sets = as.factor(sets)
methods = as.factor(methods)
lm1 <- lm(xt ~ sets + methods, weights = wt)
我需要线性模型的残差值,即。
lm1$residual
polyfit函数除了权重外没有!! Matlab中的哪个函数会给出线性模型的残差值?
答案 0 :(得分:3)
我假设你在MATLAB中有统计工具箱。如果不这样做,那么这将无效。
MATLAB中的等效代码与R
几乎相同。您所要做的就是设置一个包含变量的数据框,然后使用fitlm
或LinearModel.fit
来拟合线性模型。 fitlm
是LinearModel.fit
的最新版本,可从R2013b及以后版本获取。如果你有比此更晚的MATLAB版本,建议你使用fitlm
。如果不这样做,请使用LinearModel.fit
。 lm
中的R
符合预测变量和输出的线性模型,而fitlm
/ LinearModel.fit
在MATLAB中执行相同的操作。
您需要做的就是像上面所做的那样定义变量,但要确保使用MATLAB中的dataset
函数将它们封装在数据框中。之后,使用MATLAB中的nominal
函数创建因子变量。然后,您可以创建线性模型,但指定另一个标记Weights
以使用wt
变量对每个预测变量和输出组合进行加权。创建线性模型后,只需通过Residuals
访问残差字段。您可以在R
(a.k.a。Wilkinson notation)中以相同的方式定义预测变量和输出变量之间的输入/输出关系。
我需要指出的一个小注意事项是必须确保您的数据在列而不是行中。您将看到我正在放入数据,但使用转置运算符来确保数据在列中。因此:
% // Define data
xt = [-0.227, -0.604, 0.974, 2.639, -0.271, -0.355, -0.551, 0.342, 2.390, -1.257].';
sets = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5].';
methods = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2].';
wt = [1, 1, 1, 1, 1, 3, 3, 3, 3, 3].';
%// Create data frame and make categorical data
data = dataset(xt, sets, methods);
data.sets = nominal(data.sets);
data.methods = nominal(data.methods);
%// Create linear model and specify weights
fit = LinearModel.fit(data, 'xt ~ sets + methods', 'Weights', wt);
%// or
%// fit = fitlm(data, 'xt ~ sets + methods', 'Weights', wt);
%// Access residuals
res = fit.Residuals;
这是我得到的线性模型:
fit =
Linear regression model:
xt ~ 1 + sets + methods
Estimated Coefficients:
Estimate SE tStat pValue
(Intercept) -0.0317 0.22889 -0.13849 0.89654
sets_2 -0.24125 0.25591 -0.94273 0.3992
sets_3 0.823 0.25591 3.216 0.032403
sets_4 2.7752 0.25591 10.845 0.00041025
sets_5 -0.6875 0.25591 -2.6865 0.054855
methods_2 -0.3884 0.18689 -2.0783 0.10623
Number of observations: 10, Error degrees of freedom: 4
Root Mean Squared Error: 0.362
R-squared: 0.983, Adjusted R-Squared 0.962
F-statistic vs. constant model: 46.6, p-value = 0.00123
这些是我得到的残差:
res =
Raw Pearson Studentized Standardized
-0.1953 -0.53964 -0.64365 -0.69667
-0.33105 -0.91474 -1.2672 -1.1809
0.1827 0.50483 0.597 0.65173
-0.10455 -0.28889 -0.32875 -0.37295
0.4482 1.2384 2.3047 1.5988
0.0651 0.17988 0.37161 0.40223
0.11035 0.30491 0.73161 0.68181
-0.0609 -0.16828 -0.34468 -0.37628
0.03485 0.096296 0.1898 0.21532
-0.1494 -0.41281 -1.3306 -0.92308
只是为了自成一体,这是我从R
中的代码中获得的内容,我们应该看到输出或多或少相同:
> summary(lm1)
lm(formula = xt ~ sets + methods, weights = wt)
Weighted Residuals:
1 2 3 4 5 6 7 8 9 10
-0.19530 -0.33105 0.18270 -0.10455 0.44820 0.11276 0.19113 -0.10548 0.06036 -0.25877
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0317 0.2289 -0.138 0.89654
sets2 -0.2412 0.2559 -0.943 0.39920
sets3 0.8230 0.2559 3.216 0.03240 *
sets4 2.7753 0.2559 10.845 0.00041 ***
sets5 -0.6875 0.2559 -2.687 0.05486 .
methods2 -0.3884 0.1869 -2.078 0.10623
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3619 on 4 degrees of freedom
Multiple R-squared: 0.9831, Adjusted R-squared: 0.962
F-statistic: 46.58 on 5 and 4 DF, p-value: 0.001226
> lm1$residuals
1 2 3 4 5 6 7 8 9 10
-0.19530 -0.33105 0.18270 -0.10455 0.44820 0.06510 0.11035 -0.06090 0.03485 -0.14940
R
显示原始残差,这对应于MATLAB中Residuals
矩阵的第一列。请注意,残差仍然封装在数据框(dataset
类)中。如果要提取数值,可以使用dataset2struct
将数据集的每一列转换为结构中的字段。这样,您只需使用点表示法访问每列。
如果您使用LinearModel.fit
,残差数据框将以dataset
类型返回。但是,如果您使用fitlm
,则输出实际上是table
。在这种情况下,您需要使用table2struct
将残差转换为具有相关字段的结构。
换句话说,你会做类似的事情:
resMatrix = dataset2struct(res); %// If using LinearModel.fit
%// or
%// resMatrix = table2struct(res); %// If using fitlm
这就是我得到的:
resMatrix =
10x1 struct array with fields:
Raw
Pearson
Studentized
Standardized
然后,您可以通过以下方式访问每列:
raw = resMatrix.Raw;
pear = resMatrix.Pearson;
stu = resMatrix.Studentized;
sta = resMatrix.Standardized;
或者,如果要提取原始2D矩阵(即double
),则可以将输出转换为resMatrix = double(res)
。如果你这样做,这就是你得到的:
resMatrix = double(res)
resMatrix =
-0.1953 -0.5396 -0.6437 -0.6967
-0.3311 -0.9147 -1.2672 -1.1809
0.1827 0.5048 0.5970 0.6517
-0.1046 -0.2889 -0.3288 -0.3730
0.4482 1.2384 2.3047 1.5988
0.0651 0.1799 0.3716 0.4022
0.1103 0.3049 0.7316 0.6818
-0.0609 -0.1683 -0.3447 -0.3763
0.0349 0.0963 0.1898 0.2153
-0.1494 -0.4128 -1.3306 -0.9231
现在这是一个实际的2D矩阵,您可以在其中访问各个元素,并可以根据您的内容执行切片操作,过滤操作等。在您的情况下,您需要原始残差,因此您将执行raw = resMatrix(:,1);