class_docstr: Inherits time series methods from TSM class.
  
  **** NON-GAUSSIAN DYNAMIC REGRESSION MODELS ****
  
  Parameters
  ----------
  
  formula : string
      patsy string describing the regression
  
  data : pd.DataFrame
      Field to specify the data that will be used
  
  family : 
      e.g. pf.Normal(0,1)
docstr: Durbin and Koopman simulation smoother - simulates from states 
  given model latent variables and observations
  
  Parameters
  ----------
  
  beta : np.array
      Contains untransformed starting values for latent variables
  
  Returns
  ----------
  - A simulated state evolution
docstr_tok: ["Durbin","and","Koopman","simulation","smoother","-","simulates","from","states","given","model","latent","variables","and","observations","Parameters","--","--","--","--","--","beta",":","np.array","Contains","untransformed","starting","values","for","latent","variables","Returns","--","--","--","--","--","-","A","simulated","state","evolution"]
code: def simulation_smoother(self, beta):
      """Durbin and Koopman simulation smoother - simulates from states
      given model latent variables and observations
  
      Parameters
      ----------
  
      beta : np.array
          Contains untransformed starting values for latent variables
  
      Returns
      ----------
      - A simulated state evolution
      """
  
      T, Z, R, Q = self._ss_matrices(beta)
      H, mu = self._approximating_model(beta, T, Z, R, Q)
  
      # Generate e_t+ and n_t+
      rnd_h = np.random.normal(0, np.sqrt(H), self.data.shape[0])
      q_dist = ss.multivariate_normal(
          [0.0, 0.0], Q, allow_singular=True
      )
      rnd_q = q_dist.rvs(self.data.shape[0])
  
      # Generate a_t+ and y_t+
      a_plus = np.zeros((T.shape[0], self.data.shape[0]))
      y_plus = np.zeros(self.data.shape[0])
  
      for t in range(0, self.data.shape[0]):
          if t == 0:
              a_plus[:, t] = np.dot(T, a_plus[:, t]) + rnd_q[t]
              y_plus[t] = mu[t] + np.dot(Z, a_plus[:, t]) + rnd_h[t]
          else:
              if t != self.data.shape[0]:
                  a_plus[:, t] = np.dot(T, a_plus[:, t - 1]) + rnd_q[t]
                  y_plus[t] = mu[t] + np.dot(Z, a_plus[:, t]) + rnd_h[t]
  
      alpha_hat, _ = self.smoothed_state(self.data, beta, H, mu)
      alpha_hat_plus, _ = self.smoothed_state(y_plus, beta, H, mu)
      alpha_tilde = alpha_hat - alpha_hat_plus + a_plus
  
      return alpha_tilde
  
imports: import sys
  import numpy
  import pandas
  import scipy.stats
  from scipy import optimize
  from ..None import inference
  from ..None import families
  from ..None import output
  from ..None import tsm
  from ..None import data_check
  from ..None import covariances
  from ..None import results
  from ..None import gas
  from .kalman import *
  from .dynlin import *
label_desc: Use image node_id 24 for calling the NDynReg obj's underlying member method code with example usage: obj.simulation_smoother(beta) and returns: alpha_tilde