2017-09-11 12 views
0

constrOptimを使用して、線形重回帰の二乗誤差の合計を最適化しようとしています。メインの方程式はD = Beta1*Xa+Beta2*Xb+Beta3*Xc+Beta4*Xdで、インポートされた.csvファイルのD,Xa,Xb,Xc,Xdで、Betaは見つかった係数で、2次誤差を最小にする必要があります。constroptim関数の結果が正しくない

これまでのところ、私はDS、第Xa、Xbを、Xcの、XDは、objfunctionを作成した行列 'C' とベクトル 'd' を作成 function(Beta1,Beta2,Beta3,Beta4)'sum(E²)'=(sum(D) - sum(Beta1*Xa+Beta2*Xb+Beta3*Xc+Beta4*Xd))^2)

=各列を名前、Rにfile.csvになりインポートベータ版を< = 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 

これを研究した後、私の結論は私が悪いの初期値を使用していますので、それができるということです、パラメータ化の問題(それが必要な理由を理解していない)または単にそれが正しくプログラムされていない場合

これを修正するには何が必要ですか?

答えて

1

二乗誤差の和の式は

sum((y - yhat)^2) 

ない

(sum(y) - sum(yhat))^2 

yhatが予測値であるです。

また、あなたの唯一の制約は、推定ベータが負でなければならない(少し奇妙ですが、通常は肯定的ですが気にしないことです)、constrOptimは不要です。 Regular またはnlminbは、いわゆるボックス制約で動作します。

関連する問題