使用回归参数作为rmrm中的平均值

时间:2018-09-15 22:07:49

标签: r regression

我想测试一个模型,其中假设正常的随机变量的分布以另一个随机变量的状态为条件,该随机变量根据马尔可夫链进行状态切换。第一步将是:

假设简单的线性模型:

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来解决问题,

lm(y~x)

由于这两个系列显然是非线性的,所以我想进行回归分析,其中参数以体制为条件。可以最大可能地做到这一点,但第一步是将y的分布定义为:

y_i | x, S_t ~ N(alpha + beta_{i,s_t}); sigma^2)

如何编码以上公式?我猜这不能用rnorm完成。还有另一种方法吗?

谢谢

1 个答案:

答案 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()

enter image description here

有两种体制,bearbull。这些体制的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.483bear的参数为均值= -0.616和标准偏差= 2.341。它们接近真实值。

贝叶斯分析

这是尝试使用贝叶斯分析通过jagsrjags软件包解决此问题。

我运行了贝叶斯模型来估计{{1}上{{1}的均值alphay({{1上bear的差}}和beta)和sigma(ybear上的bull的标准偏差)使用10000次迭代。

y

enter image description here

enter image description here

该图表明估计值混合得很好。

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.5beta[2]相加,则会得到2.315,而实际值为alpha。我们还将beta[2]1.701分别称为1.7s[1],分别类似于s[2]2.369

引导程序

这是使用引导程序来估计1.52.3和标准差的另一种方法,该方法基于1.6包。

alpha

现在我们可以打印结果了。都类似于真实值。

beta