假设简单的线性模型:
lm(y~x, data=data)
我想在x切换状态下找到分布的参数。
例如:
mkt.bull <- rnorm(150, 2, 1.5)
mkt.bear <- rnorm(150, -1, 2.5)
x <- c(mkt.bear,mkt.bull)
portfolio.bull <- rnorm(150, 1.75, 1.6)
portfolio.bear <- rnorm(150, -0.5, 2.3)
y <- c(portfolio.bear,portfolio.bull)
在上面的示例中,x可以建模为具有两种状态(一头牛和一头熊)的马尔可夫切换模型(msmFit
)。
lm(y~x)
由于这两个系列显然是非线性的,所以我想进行回归分析,其中参数以体制为条件。可以最大可能地做到这一点,但第一步是将y的分布定义为:
y_i | x, S_t ~ N(alpha + beta_{i,s_t}); sigma^2)
如何编码以上公式?我猜这不能用rnorm完成。还有另一种方法吗?
谢谢
答案 0 :(得分:0)
我准备并可视化了数据。
# Load packages
library(tidyverse)
library(rjags)
# Set seed for reproduciblility
set.seed(199)
mkt.bull <- rnorm(150, 2, 1.5)
mkt.bear <- rnorm(150, -1, 2.5)
x <- c(mkt.bear,mkt.bull)
portfolio.bull <- rnorm(150, 1.75, 1.6)
portfolio.bear <- rnorm(150, -0.5, 2.3)
y <- c(portfolio.bear,portfolio.bull)
# Create example data frame
dat <- data.frame(x = x, y = y, regime = c(rep("bear", 150), rep("bull", 150)),
stringsAsFactors = FALSE)
# Plot the sample distribution
dat$regime <- factor(dat$regime, levels = c("bear", "bull"))
# Create a plot
ggplot(dat, aes(x = y, color = regime)) +
geom_density()
有两种体制,bear
和bull
。这些体制的y
都是正态分布的。好像OP希望估计以这些状态为条件的y
的平均值和标准偏差。
这是使用stats4
包使用最大似然估计参数的一种方法。
# Load the infer package
library(stats4)
# Split the data
y_bull <- dat %>% filter(regime %in% "bull") %>% pull("y")
y_bear <- dat %>% filter(regime %in% "bear") %>% pull("y")
# Define the log-likelihood function
LogLike_bull <- function(Mean, Sigma){
R <- suppressWarnings(dnorm(y_bull, Mean, Sigma))
return(-sum(log(R)))
}
LogLike_bear <- function(Mean, Sigma){
R <- suppressWarnings(dnorm(y_bear, Mean, Sigma))
return(-sum(log(R)))
}
mle(minuslogl = LogLike_bull, start = list(Mean = 1, Sigma = 1))
# Call:
# mle(minuslogl = LogLike_bull, start = list(Mean = 1, Sigma = 1))
#
# Coefficients:
# Mean Sigma
# 1.703099 1.482619
mle(minuslogl = LogLike_bear, start = list(Mean = 1, Sigma = 1))
# Call:
# mle(minuslogl = LogLike_bear, start = list(Mean = 1, Sigma = 1))
#
# Coefficients:
# Mean Sigma
# -0.616106 2.340852
bull
的参数为均值= 1.703
和标准偏差= 1.483
。 bear
的参数为均值= -0.616
和标准偏差= 2.341
。它们接近真实值。
这是尝试使用贝叶斯分析通过jags
和rjags
软件包解决此问题。
我运行了贝叶斯模型来估计{{1}上{{1}的均值alpha
,y
({{1上bear
的差}}和beta
)和sigma(y
和bear
上的bull
的标准偏差)使用10000次迭代。
y
该图表明估计值混合得很好。
bear
bull
上# Define the Bayesian model
model <- "model{
for(i in 1:length(Y)) {
Y[i] ~ dnorm(Mean[i], s[X[i]]^(-2))
Mean[i] <- alpha + beta[X[i]]
}
alpha ~ dnorm(0, 5^(-2))
beta[1] <- 0
beta[2] ~ dnorm(0, 5^(-2))
s[1] ~ dunif(0, 10)
s[2] ~ dunif(0, 10)
}"
# Compile the model
jags_model <- jags.model(
textConnection(model),
data = list(Y = dat$y, X = dat$regime),
n.chains = 3,
inits = list(.RNG.name = "base::Wichmann-Hill", .RNG.seed = 10)
)
# Simulate the posterior
jags_sim <- coda.samples(model = jags_model,
variable.names = c("alpha", "beta", "s"),
n.iter = 10000)
# Plot the posterior
plot(jags_sim)
的平均值为# See the summary
summary(jags_sim)
Iterations = 1001:11000
Thinning interval = 1
Number of chains = 3
Sample size per chain = 10000
1. Empirical mean and standard deviation for each variable,
plus standard error of the mean:
Mean SD Naive SE Time-series SE
alpha -0.614 0.19436 0.0011222 0.0027201
beta[1] 0.000 0.00000 0.0000000 0.0000000
beta[2] 2.315 0.23099 0.0013336 0.0032666
s[1] 2.369 0.13768 0.0007949 0.0010393
s[2] 1.500 0.08836 0.0005102 0.0006727
2. Quantiles for each variable:
2.5% 25% 50% 75% 97.5%
alpha -0.9838 -0.7471 -0.6147 -0.4857 -0.2225
beta[1] 0.0000 0.0000 0.0000 0.0000 0.0000
beta[2] 1.8582 2.1622 2.3174 2.4760 2.7586
s[1] 2.1225 2.2722 2.3632 2.4564 2.6611
s[2] 1.3368 1.4390 1.4959 1.5579 1.6813
,与实际值alpha
相似。 bear
的平均值为-0.614
。如果我们将-0.5
和beta[2]
相加,则会得到2.315
,而实际值为alpha
。我们还将beta[2]
和1.701
分别称为1.7
和s[1]
,分别类似于s[2]
和2.369
。
这是使用引导程序来估计1.5
,2.3
和标准差的另一种方法,该方法基于1.6
包。
alpha
现在我们可以打印结果了。都类似于真实值。
beta