Toplam katsayıların toplamı = 1 olsun, R'de sınırlı bir regresyona nasıl uyurum?


36

Burada benzer bir kısıtlı regresyon görüyorum:

Belirli bir noktadan sınırlandırılmış doğrusal regresyon

ama ihtiyacım biraz farklı. 1'e eklenmesi gereken katsayılara ihtiyacım var. Özellikle, 1 döviz serisinin getirilerini diğer 3 döviz serisine karşı geri çeviriyorum, böylece yatırımcılar bu seriye maruz kaldıklarını diğer 3'e maruz bırakma kombinasyonuyla değiştirebilirler. nakit harcama değişmemelidir ve tercihen (ancak bu zorunlu değildir), katsayılar pozitif olmalıdır.

R ve Google’da sınırlı bir gerileme aramaya çalıştım ama çok az şansla.


Bunun sınırlı bir regresyon sorunu olduğundan emin misiniz? Soruyu okuduğumda, (bir Forex serisi) = (artı, geçerli bir getiri oranını temsil eden dördüncü bir terim ) şeklinde bir ilişki . Bu yatırım kararından bağımsız. Bir müşteri yatırım yapmak istiyorsa sermaye kullanarak , ve yakınlık gibi, o zaman sadece yatırım yapacağını içinde , c \ beta_2 içinde y_2 ve c \ beta_3 içinde y_3β 1 y 1 + β 2 y 2 + β 3 y 3 y 1 c β 2y4β1y1+β2y2+β3y3y 4 y 1 y 2 y 3 c β 1 y 2 c β 3 y 3cy4y1y2y3cβ1y1cβ2y2cβ3y3. Bu regresyona özel bir komplikasyon katmıyor, değil mi?
whuber

Bunu yaparsanız, bunu modellerseniz birçok durumda B1 + B2 + B3> 1'i (veya diğerlerinde <1'i) bulacaksınız. Bunun nedeni, tanımlayıcılarla çoğaltılmaya çalışan para biriminin diğerlerinden daha büyük veya daha küçük uçuculuğa sahip olması ve bu nedenle regresyonun cevaben size daha küçük veya daha büyük ağırlıklar vermesidir. Bu, yatırımcının ya tamamen yatırım yapmamasını ya da istemediğim kaldıracı kullanmasını gerektirir. Güvenli getiri oranı için ise hayır. Tek yapmaya çalıştığımız seri1'i diğer değişkenleri kullanarak çoğaltmak. Finansman adamı ve istatistikçi değil, belki de sorumu yanlış adladım.
Thomas Browne

Güvenli bir getiri oranı için bir terim eklemenin nedeni, bazen sıfır olmayan bir katsayısına sahip olacağıdır. Muhtemelen, güvenli araçlar (gecelik banka mevduatı) düşük maliyetle herkese açıktır, bu yüzden yatırım sepetinin bir bileşeni olarak bunu görmezden gelenler düşük kaliteli kombinasyonlar seçebilir. Şimdi, eğer katsayılar birliğe katılmazsa, ne olmuş? Sadece regresyon tarafından tahmin edilen oranlara dilediğiniz kadar yatırım yapın .
whuber

doğru ..... bu kadar basit. Teşekkürler. Şimdi biraz aptal hissediyorum haha.
Thomas Browne,

1
Aptalca değil. Sadece bu soruyu sormak yüksek bir düşünce seviyesini yansıtıyor. Etkili bir cevap aldığınızdan emin olmak için kendi sorunuza dair kendi anlayışımı kontrol ediyordum. Şerefe.
whuber

Yanıtlar:


35

Eğer doğru anlamak, sizin modeldir ile ve . Sen en aza indirmek gerekir bu kısıtlamalara tabi. Bu tür bir sorun ikinci dereceden programlama olarak bilinir .k π k = 1 π k0 i ( Y i - ( π 1 X i 1 + π 2 X i 2 + π 3 X i 3 ) ) 2

Y=π1X1+π2X2+π3X3+ε,
kπk=1πk0
i(Yi(π1Xi1+π2Xi2+π3Xi3))2

Burada bir muhtemel çözüm veren R kodlarının birkaç hattı ( sütunları olan , gerçek değerler 0.2, 0.3 ve 0.5 edilir).π kX1,X2,X3Xπk

> library("quadprog");
> X <- matrix(runif(300), ncol=3)
> Y <- X %*% c(0.2,0.3,0.5) + rnorm(100, sd=0.2)
> Rinv <- solve(chol(t(X) %*% X));
> C <- cbind(rep(1,3), diag(3))
> b <- c(1,rep(0,3))
> d <- t(Y) %*% X  
> solve.QP(Dmat = Rinv, factorized = TRUE, dvec = d, Amat = C, bvec = b, meq = 1)
$solution
[1] 0.2049587 0.3098867 0.4851546

$value
[1] -16.0402

$unconstrained.solution
[1] 0.2295507 0.3217405 0.5002459

$iterations
[1] 2 0

$Lagrangian
[1] 1.454517 0.000000 0.000000 0.000000

$iact
[1] 1

Tahmin edicilerin asimptotik dağılımları hakkında herhangi bir sonuç bilmiyorum, vs. Biri işaretçiler varsa, biraz almak isterim (dilerseniz bu konuda yeni bir soru açabilirim).


Aslında hızlı bir soru. Toplamdan ziyade varyansı minimize etmemeli miyim? Bir regresyonun yaptığı şey, hataların karesinin varyansını minimize etmek değil midir?
Thomas Browne,

6
Bu akıllıca, Elvis, ama aynı şeyi sadece gerilemeyi tekrar ölçerek başaramaz mıydın? Örneğin, Bu, . tahminleri ve standart hataları , ve değişkenlerinden ve var-kovar matrisinden hesaplamak için . Y - X 3 = α 1 ( X, 1 - X 3 ) + α 2 ( X- 2 - x 3 ) + s tt i α 1 α 2Y=α1X1+α2X2+(1α1α2)X3+εYX3=α1(X1X3)+α2(X2X3)+επiα1α2
whuber

6
ama daha gürültülü verilerle veya bazılarıyla Evet @whuber yakın , kolayca kısıt ihlal ediyorum sorun "sert" bir parçasıdır. 0 π k > 0πk0πk>0
Elvis

2
Olumlu bir katsayı, bir döviz almanızı söyler; negatif bir katsayı, onu satmanızı söyler. Zaten bu para birimine sahip değilseniz, satmak için ödünç almanız gerekir ("kısa satış"). Kısıtlanmamış borçlanma, insanların başını belaya sokabileceğinden, borçlanma miktarına ve bunun nasıl ödendiğine ("marj gereklilikleri" ve "sermaye taşıma maliyetleri" ve "piyasaya sunulacak" prosedürler) kısıtlamalar vardır. Bu nedenle, borçlanma mümkündür, ancak piyasadaki büyük oyuncular tarafından veya büyük avantajlar sağlamadıkça sıklıkla kaçınılır.
whuber

2
Tüm yardım için herkese çok teşekkürler. Aslında sadece döviz piyasaları hakkında genel bir yorum yapmak için, hisse senetlerinden veya tahvillerden daha kısadırlar çünkü kısa bir satıştan önce bir hisse senedi almak zorunda değildir. Biri basitçe payda ve pay para birimlerini çevirir. Dolayısıyla, örneğin EURUSD satmak ve USDEUR satmak, risk departmanı açısından tam olarak denk işlemlerdir, fakat elbette tam tersi pozisyonlardır. Bu yüzden FX, miktar işlemciler için çok iyi bir oyun alanıdır, çünkü hisse senetleri için çok daha önemli olan yönel sürtünmeler konusunda endişelenmeleri gerekmez
Thomas Browne

8

Whuber tarafından belirtildiği gibi, yalnızca eşitlik kısıtlarıyla ilgileniyorsanız, modelinizi yeniden yazarak da standart lm () işlevini kullanabilirsiniz:

Y=α+β1X1+β2X2+β3X3+ϵ=α+β1X1+β2X2+(1β1β2)X3+ϵ=α+β1(X1X3)+β2(X2X3)+X3+ϵ

Ancak bu, eşitsizlik kısıtlamalarınızın yerine getirildiğini garanti etmez! Ancak bu durumda, yukarıdaki ikinci dereceden programlama örneğini kullanarak (X3'ü sola koyarak) tam olarak aynı sonucu elde edersiniz:

X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2,0.3,0.5) + rnorm(100, sd=0.2)
X1 <- X[,1]; X2 <-X[,2]; X3 <- X[,3]
lm(Y-X3~-1+I(X1-X3)+I(X2-X3))

Yukarıdaki örnekte Matifou tarafından üçüncü katsayının negatif olmasını engellemek için ne yapmalı? Örneğin, için en uygun katsayılara sahip ve biz alacağı üçüncü katsayısı negatif olduğunu ve bu nedenle temel barındırmama burada ima eden İstediğiniz regresyon β1=0.75β2=0.5(1β1β2)=0.25
AS

1
Bunu işaret ettiğiniz için teşekkürler @AS. Aslında, bu çözüm eşitsizlikler değil, yalnızca eşitlik kısıtlamaları için çalışmaktadır. Metni buna göre düzenledim.
Matifou

1

Modelinizi anlayabildiğim gibi, ı bulmaya çalışıyorsunuz, öyle ki

x¯¯b¯=y¯
[b¯]=1

Bu tür sorunları tedavi etmenin en kolay yolunu, matrislerin ilişkisel özelliklerini diğer değişkenlerin bir fonksiyonu olarak ele almak için kullanmak olduğunu buldum .b¯

Örn, , dönüşüm bloğu üzerinden bir . Senin durumunda, aşağıdaki . Burada bizim ayırabilirsiniz nowns ve nknowns. b¯c¯Tc¯¯r1

b¯=[k0k1k2]=Tc¯¯c¯=[100010111][k0k1r]
ku
c¯=[k0k1r]=Su¯¯cu¯+Sk¯¯ck¯=[100100][k0k1]+[001]r
Farklı dönüşümü birleştirebilirken / ayırma blokları, daha karmaşık modellerle hantallaşıyor. Bu bloklar bilgi ve bilinmeyenlerin ayrılmasını sağlar. ˉ ˉ v ¯ c u = ˉ w
x¯¯Tc¯¯(Su¯¯cu¯+Sk¯¯ck¯)=y¯v¯¯=x¯¯Tc¯¯Su¯¯w¯=y¯x¯¯Tc¯¯Sk¯¯ck¯
Sonunda sorun .
v¯¯cu¯=w¯

1

Eski soru ama aynı sorunla karşı karşıya kaldığımdan beri, 2p'imi göndermeyi düşündüm ...

@Elvis önerdiği ancak kullanma gibi kuadratik programlama kullanın sqlincon gelen pracma paketinin. Bence avantaj quadrpog::solve.QP, kısıtlamaları belirleyen daha basit bir kullanıcı arayüzü. (Aslında, lsqlinconetrafındaki bir sarıcı solve.QP).

Örnek:

library(pracma)

set.seed(1234)

# Test data
X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2, 0.3, 0.5) + rnorm(100, sd=0.2)

# Equality constraint: We want the sum of the coefficients to be 1.
# I.e. Aeq x == beq  
Aeq <- matrix(rep(1, ncol(X)), nrow= 1)
beq <- c(1)

# Lower and upper bounds of the parameters, i.e [0, 1]
lb <- rep(0, ncol(X))
ub <- rep(1, ncol(X))

# And solve:
lsqlincon(X, Y, Aeq= Aeq, beq= beq, lb= lb, ub= ub)

[1] 0.1583139 0.3304708 0.5112153

Elvis ile aynı sonuçlar:

library(quadprog)
Rinv <- solve(chol(t(X) %*% X));
C <- cbind(rep(1,3), diag(3))
b <- c(1,rep(0,3))
d <- t(Y) %*% X  
solve.QP(Dmat = Rinv, factorized = TRUE, dvec = d, Amat = C, bvec = b, meq = 1)$solution

EDIT Gung'un yorumunu ele almaya çalışmak için işte bir açıklama. sqlincon matlab'ın hoş bir yardım sayfasına sahip olan lsqlin'ini taklit eder . İşte benim (küçük) düzenlemelerimin ilgili bölümleri:

XÇarpan matrisi, çiftlerin matrisi olarak belirtilir. C, C * x - Y ifadesinde, x çözeltisinin çarpanını temsil eder. C, M ile by-N'dir; burada M, denklemlerin sayısıdır ve N, x'in elementlerinin sayısıdır.

Yİkili bir vektör olarak belirtilen sabit vektör. Y, C * x - Y ifadesinde katkı sabit terimini temsil eder. Y, M-ile-1'dir; buradaki M, denklemlerin sayısıdır.

Aeq: Çiftler için bir matris olarak belirtilen doğrusal eşitlik kısıtlama matrisi. Aeq, kısıtlardaki lineer katsayıları temsil eder Aeq * x = beq. Aeq'in Meq-by-N büyüklüğü vardır; burada Meq, kısıtlamaların sayısıdır ve N, x'in elemanlarının sayısıdır.

beqLineer eşitlik kısıtlama vektörü, çiftler vektörü olarak belirtilir. beq, kısıtlardaki sabit vektörü temsil eder Aeq * x = beq. beq'in uzunluğu Meq, burada Aeq Meq-by-N'dir.

lbİkili bir vektör olarak belirtilen alt sınırlar. lb elementel olarak alt sınırları lb ≤ x element ub cinsinden gösterir.

ubÜst sınırlar, çiftler vektörü olarak belirtilir. ub, lb ≤ x ≤ ub içindeki elementel olarak üst sınırları temsil eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.