Y = x1 + x2 + x3 + x4 + x5
すべての係数の合計が5に等しくなければならないという制約の下で、通常の最小二乗を使用して単純な線形関数を最小化したいのですが、Rでこれをどのように達成できますか?私が見たすべてのパッケージは、個々の係数に対する制約を許可しているように見えますが、係数に影響を与える単一の制約を設定する方法を理解できません。私はOLSに縛られていません。これが反復的なアプローチを必要とする場合、それも問題ありません。
2 に答える
あなたは他のアプローチにオープンであると言ったので、これは二次計画法(QP)の観点からも解決できます:
二次目的を最小化します: 二乗誤差の合計、
線形制約に従います。重みの合計は 5 でなければなりません。
X が n 行 5 列の行列で、Y が長さ (n) のベクトルであると仮定すると、これは最適な重みを解決します。
library(limSolve)
lsei(A = X,
B = Y,
E = matrix(1, nrow = 1, ncol = 5),
F = 5)
基本的な計算は次のとおりです。
mu = a0 + a1*x1 + a2*x2 + a3*x3 + a4*x4
と応答変数の間の SSQ を最小化しa0
ます。a4
mu
y
制約を尊重するために最後のパラメーター (たとえばa4
) を (たとえば)に置き換えると、新しい線形方程式のセットになります。C-a1-a2-a3
mu = a0 + a1*x1 + a2*x2 + a3*x3 + (C-a1-a2-a3)*x4
= a0 + a1*(x1-x4) + a2*(x2-x4) + a3*(x3-x4) + C*x4
(a4
消えてますのでご注意ください…)
このようなもの (テストされていません!) は R で実装されています。
元のデータ フレーム:
d <- data.frame(y=runif(20), x1=runif(20), x2=runif(20), x3=runif(20), x4=runif(20))
最後の列を除くすべての列が「一掃」された変換バージョンを作成します。
x1 -> x1-x4; x2 -> x2-x4; ...
dtrans <- data.frame(y=d$y, sweep(d[,2:4], 1, d[,5], "-"), x4=d$x4)
混乱を最小限に抑えるために、名前を
tx1
、tx2
、 ... に変更します。names(dtrans)[2:4] <- paste("t",names(dtrans[2:4]),sep="")
係数の和の制約:
constr <- 5
次に、オフセットを使用してモデルを適合させます。
lm(y~tx1+tx2+tx3,offset=constr*x4,data=dtrans)
これをより一般化することはそれほど難しくありません。
これには、既定の最適化プログラムに制約を指定するだけではなく、もう少し考えて操作する必要があります。一方、(1)便利な関数で簡単にラップできます。(2)問題は依然として線形であるため(実際には、開始した次元よりも1次元小さいため)、汎用オプティマイザーを呼び出すよりもはるかに効率的です。ビッグデータでも可能です (例: biglm
)。(実際、これが線形モデルである場合、オフセットを使用する必要はありませんが、オフセットを使用すると、a0=intercept-C*x4
終了後に計算する必要がないことがわかります。)