2016-10-17 15 views
0

私はRが新しく、援助を感謝します。 制約に最適化問題があります。 Rの最適化を解決するにはいくつかの方法がありますが、私は適用する必要がある制約で正しく問題を表現できませんでした。LS回帰制約あり

Iは、次の3つのカテゴリに次のデータがあるとします。私は、(二乗誤差を最小化する)の各カテゴリのデータポイントに指数関数Y(T)に合わせたい

A<-c(99.1, 96.5, 94.4, 92.7, 91.5, 91.3, 91.4, 90.1, 87.1, 82.6, 76.4) 
B<-c(146.4, 140.2, 133.6, 126.5, 118.7, 109.4, 101.2, 101.8, 103.7, 102.5, 98.3) 
C<-c(237.5, 213.9, 191, 168.9, 147.4, 124.9, 108.3, 95.7, 84.4, 73.5, 63) 
t<-seq(1:11) 
DT<-cbind.data.frame(t,A,B,C) 

をその結果、Y(T)_c> Y(T)_b> Y(T)_a>選択トンため 0 [1 15]

答えて

0

Iは、回帰に制約を組み込むしようとしないであろう。 ちょうど3つの別個の回帰を構築:

fit_loga <- lm(y ~ log(A) + t, data=DT) 
fit_logb <- lm(y ~ log(B) + t, data=DT) 
fit_logc <- lm(y ~ log(C) + t, data=DT) 

fit_a <- exp(A) 
fit_b <- exp(B) 
fit_c <- exp(C) 

が、それらはその範囲にどこでも制約を満たしていることを確認し(または少なくとも、すべての整数データポイントで):(fit_c > fit_b) & (fit_b > fit_a)。そうでない場合にのみ、私たちはそれについて心配します。以下のように、おそらく、モデルにトンで、いくつかの他の用語ではexp(t)I(t^2)poly(t, <order>) ...

EDITを投げる:私はsolnpパッケージを知りませんでした。

+0

ありがとう:上記のデータを使用して 、私は以下の持っています!私はあなたが示唆するように2つのステップでそれを作ることを考えていましたが、CとBとAが明確に交差するこのケースではどうしますか? 私は、すべての曲線について同じような曲線形式(ここでは指数関数的)を保つ必要があることを恐れています。したがって、1つのパラメータは別のパラメータに影響し、最適化を一度に実行する必要があります。私は指数曲線に合うようにするよりも、ログ空間内の線形曲線のパラメータを探すべきであることに完全に同意します。 – Walle

+0

ああ。もしそれらが交差するならば、その制約をどのように適用するのですか? min/maxを使ってクランプのようなクルージングをしないで? – smci

+1

私は、問題が不等式制約を扱うことができる{solnp()}のような最適化関数で解決できると考えました。しかし、収束しないか、与えられた制約で二乗誤差を最小にするために直接適用されたとき、実行不可能な解をもたらす。 – Walle

0

私は、solnpを使用して取得するエラーメッセージは、ほとんど不十分な制約を参照していると考えました。また、ドキュメントに記載されているように、すべてのパラメータを1つのベクトルに入れる必要があります。コードを適切に調整した後、問題を変更することなく、自分の制約をy(t)_c > y(t)_b > y(t)_a > 0に直接実装することができました。最も便利な方法は、ソルバーの行列形成を使用することです。お返事のSMCIため Results shown here

library(data.table) 
library(Rsolnp) 

t<-as.vector(10:20) 
DT<-cbind.data.frame(A,B,C) 
tlogDT<-transpose(log(DT)) 

# min[log(y)'- Ax-b] 
# Arr = [A1 A2 .. An b1 b2 .. bn] 

gofn = function(arrin) 
{ 
    arr = cbind(arrin[1:3],arrin[4:6]) 
    sum(
    (as.matrix(arr[,1])%*%t + arr[,2] - tlogDT)^2 
) 
} 

nocross=t #defines the times where the curves are not allowed to intersect 
ineqfn2=function(arrin) 
{ 
    #constrains: 
    # 0<f_a(t)<f_b(t)<f_c(t), for some t, 
    arr = cbind(arrin[1:3],arrin[4:6]) 
    nextarr=as.matrix(rbind(rep(0,2),arr[1:(length(arr[,1])-1),])) 
    ineqmat=as.matrix(arr[,1])%*%nocross+arr[,2]-nextarr[,1]%*%nocross-nextarr[,2] 
    as.vector(t(ineqmat)) 
} 

#lines should be aligned with the first startvalue 
eqfn = function(arrin) 
{ 
    arr = cbind(arrin[1:3],arrin[4:6]) 
    arr[,1]*t[1]+arr[,2]-tlogDT[,1] 
} 
#start values: 
An=c(1,1,1) 
bn=tlogDT[,1] 
vstart=c(An,bn) 

r <- solnp(
    vstart, gofn, 

    eqfun = eqfn, eqB= c(0,0,0), 

    ineqfun = ineqfn2, 
    ineqLB = rep(0,length(DT[1,])*length(nocross)), 
    ineqUB = rep(5000,length(DT[1,])*length(nocross)) 
) 

r$pars[1] 
line1 = exp(r$pars[4]+r$pars[1]*t) 
line2 = exp(r$pars[5]+r$pars[2]*t) 
line3 = exp(r$pars[6]+r$pars[3]*t) 

plot(t, DT[,3],log = "y") 
points(t, DT[,2],col="green") 
points(t, DT[,1],col="blue") 

lines(t, line1,lwd=2, col = "blue", xlab = "Time (s)", ylab = "Counts") 
lines(t, line2,lwd=2, col = "green", xlab = "Time (s)", ylab = "Counts") 
lines(t, line3,lwd=2, col = "black", xlab = "Time (s)", ylab = "Counts") 
関連する問題