我尝试使用constrOptim来优化线性多元回归中的平方误差之和。主要等式应为D = Beta1*Xa+Beta2*Xb+Beta3*Xc+Beta4*Xd
,其中D,Xa,Xb,Xc,Xd
来自导入的.csv文件,Beta
s是我想要找到的系数,最小化二次误差。
到目前为止,我将file.csv导入R,将每列命名为Ds,Xa,Xb,Xc,Xd,创建了objfunction =
function(Beta1,Beta2,Beta3,Beta4)'sum(E²)'=(sum(D) - sum(Beta1*Xa+Beta2*Xb+Beta3*Xc+Beta4*Xd))^2)
创建了矩阵' C'和矢量' d'配置应将Beta限制为< = 0的约束。我不知道如何找到可行区域,尽管我已经使用了使该函数有效的初始值。
以下是代码:
> Tabela= read.table("Simulacao.csv", header=T, sep= ";")
> Tabela
D A B C D.1
1 -1 1 -1 0 0
2 4 0 0 1 -1
3 4 1 0 -1 0
4 0 0 1 0 -1
5 -2 1 0 0 -1
> Ds= Tabela[,1]
> Xa= Tabela[,2]
> Xb= Tabela[,3]
> Xc= Tabela[,4]
> Xd= Tabela[,5]
> simulaf= function(x1,x2,x3,x4) {
+ Ds= Tabela[,1]
+ Xa= Tabela[,2]
+ Xb= Tabela[,3]
+ Xc= Tabela[,4]
+ Xd= Tabela[,5]
+ J=sum(Ds)
+ H=sum(x1*Xa+x2*Xb+x3*Xc+x4*Xd)
+ sx=(J-H)^2
+ return(sx)
+ }
> s= function(x) {simulaf(x[1],x[2],x[3],x[4])}
> d= c(0,0,0,0)
> C= matrix(c(-1,0,0,0,0,-1,0,0,0,0,-1,0,0,0,0,-1),nrow=4,ncol=4,byrow=T)
> constrOptim(c(-1,-1,-1,-1),s,NULL,C,d)
$par
[1] -0.2608199 -0.8981110 -1.1095961 -1.9274866
我期望的结果应该是:
$par
[1] -0.125 0 -0.5 -0.875
在对此进行研究之后,我的结论是,可能是因为我使用了错误的初始值,参数化问题(不理解为什么需要它)或者它是否仅仅是我编程的它不正确。
我需要做些什么来解决这个问题?
答案 0 :(得分:1)
误差平方和的公式是
sum((y - yhat)^2)
和不
(sum(y) - sum(yhat))^2
其中yhat
是预测值。
另外,如果你唯一的限制是估计的测试版应该是负面的(这有点奇怪,通常你希望它们是积极的但是没关系),那么你就不需要constrOptim
。常规optim(method="L-BFGS-B")
或nlminb
将适用于所谓的框限制。