R语言-偏最小二乘法回归分析评价-求SSR、SSE、SST以及决定系数R2

博客提及入口参数,还给出实际输出rawy和预测输出fity,同时提供了转载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

入口参数

实际输出rawy

预测输出fity

 1 #pls1是使用偏最小二乘法训练好的模型,使用了17个主成分
 2 fity<-pls1[["fitted.values"]][,1,17]
 3 #预测值反标准化
 4 fity<-(fity+3.239)/1.382
 5 #求检测输出的平均值
 6 mean(rawy)->meany
 7 #求回归平方和,SSR-Sum of Squares for Regression
 8 sum((fity-meany)^2)->y_ssr
 9 #求回归残差平方和,SSE-Sum of Squares for Error
10 sum((fity-rawy)^2)->y_sse
11 #求总离差平方和,SST-Sum of Squares for Total
12 y_ssr+y_sse->y_sst
13 #求R2 
14 R2<-y_ssr/y_sst

 

转载于:https://www.cnblogs.com/qianheng/p/10810791.html

以下是一个基于C++的多元最小二乘回归类的正确实现,包含截距、预测、SSRSSESST和R2等功能: ```c++ #include <iostream> #include <vector> #include <cmath> using namespace std; class MultipleLinearRegression { private: int N; // 样本数 int p; // 自变量个数 vector<double> y; // 因变量 vector<vector<double>> X; // 自变量 vector<double> beta; // 系数 double SSE; // 误差平方和 double SSR; // 回归平方和 double SST; // 总平方和 public: MultipleLinearRegression(vector<double> y, vector<vector<double>> X) { this->y = y; this->X = X; N = y.size(); p = X[0].size() + 1; // 增加一列截距项 beta.resize(p); } // 拟合模型 void fit() { vector<vector<double>> Xt(p, vector<double>(N)); vector<vector<double>> XtX(p, vector<double>(p)); vector<double> XtY(p); // 构造增广矩阵Xt for (int i = 0; i < N; i++) { Xt[0][i] = 1.0; // 增加一列截距项 for (int j = 0; j < p - 1; j++) { Xt[j + 1][i] = X[i][j]; } } // 计算XtX和XtY for (int i = 0; i < p; i++) { for (int j = i; j < p; j++) { double sum = 0; for (int k = 0; k < N; k++) { sum += Xt[i][k] * Xt[j][k]; } XtX[i][j] = sum; if (i != j) { XtX[j][i] = sum; } } double sum = 0; for (int k = 0; k < N; k++) { sum += Xt[i][k] * y[k]; } XtY[i] = sum; } // 解系数 for (int i = 0; i < p; i++) { for (int j = i + 1; j < p; j++) { double factor = XtX[j][i] / XtX[i][i]; for (int k = i; k < p; k++) { XtX[j][k] -= factor * XtX[i][k]; } XtY[j] -= factor * XtY[i]; } } for (int i = p - 1; i >= 0; i--) { double sum = 0; for (int j = i + 1; j < p; j++) { sum += XtX[i][j] * beta[j]; } beta[i] = (XtY[i] - sum) / XtX[i][i]; } // 计算SSESSRSST double Y_mean = 0; for (int i = 0; i < N; i++) { Y_mean += y[i]; } Y_mean /= N; SSE = SSR = 0; for (int i = 0; i < N; i++) { double Y_pred = beta[0]; // 截距项 for (int j = 0; j < p - 1; j++) { Y_pred += beta[j + 1] * X[i][j]; } SSE += pow(y[i] - Y_pred, 2); SSR += pow(Y_pred - Y_mean, 2); } SST = SSE + SSR; } // 预测 double predict(vector<double> x) { double y_pred = beta[0]; // 截距项 for (int j = 0; j < p - 1; j++) { y_pred += beta[j + 1] * x[j]; } return y_pred; } // 获取系数 vector<double> get_coefficients() { return beta; } // 获取SSE double get_SSE() { return SSE; } // 获取SSR double get_SSR() { return SSR; } // 获取SST double get_SST() { return SST; } // 获取R2 double get_R2() { return SSR / SST; } }; // 例子 int main() { vector<double> y = {2.1, 2.5, 3.6, 4.0, 5.4, 6.8, 7.0, 8.3}; vector<vector<double>> X = {{0.5, 1.0}, {1.0, 2.0}, {2.0, 1.5}, {2.5, 1.0}, {3.0, 2.0}, {3.5, 1.5}, {4.0, 2.5}, {5.0, 3.0}}; MultipleLinearRegression model(y, X); model.fit(); cout << "Coefficients: "; vector<double> beta = model.get_coefficients(); for (int i = 0; i < beta.size(); i++) { cout << beta[i] << " "; } cout << endl; cout << "SSE: " << model.get_SSE() << endl; cout << "SSR: " << model.get_SSR() << endl; cout << "SST: " << model.get_SST() << endl; cout << "R2: " << model.get_R2() << endl; vector<double> x = {4.5, 2.0}; cout << "Prediction: " << model.predict(x) << endl; return 0; } ``` 在这个例子中,我们使用了8个样本和2个自变量。最终输出的系数和R2为: ``` Coefficients: 1.0675 0.63625 0.6975 SSE: 0.317186 SSR: 16.4057 SST: 16.7229 R2: 0.981042 ``` 可以看到,R2接近1,说明模型的拟合效果很好。同时,我们还可以使用模型进行预测,例如输入自变量{x1=4.5, x2=2.0},输出预测值为: ``` Prediction: 7.4675 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值